Voor Joomla ben ik een plugin aan het maken die verschillende woorden kan vervangen door een abbrev/span tag voor de betekenis ervan. Hiervoor heb ik de volgende code in gebruik:

<?php
        $style_cursor = $this->params->get('cursor','default');
        $style_border_width = $this->params->get('border-width','dashed');
        $style_border_style = $this->params->get('border-style','dashed');
        $style_border_color = $this->params->get('border-color','dashed');
        $style = "abbr, acronym, span.abbr {"
            . "\n cursor: ".$style_cursor.";"
            . "\n border-bottom: ".$style_border_width."px ".$style_border_style." ".$style_border_color.";"
            . "\n}";
        $document = &JFactory::getDocument();
        $document->addStyleDeclaration( $style );
        $abbrevs = $this->getAbbrev();
        $replacements = $this->createReplacements();
        $article->text = str_replace($abbrevs, $replacements, $article->text);
?>

Het vervangen gaat dan ook geheel zonder problemen, alleen gebeurt het ook wel eens dat een woord die in de abbrevs array staat ook voorkomt in een img-tag, of een a href-tag. Hoe kan ik dan de bovenstaande code het beste aanpassen, zodat de str_replace (die dus zover ik weet dan wel door een preg_replace vervangen moet gaan worden) alleen buiten de html tags om vervangt.
Probleem opgelost door een wijziging in de functie doAbbriviates met behulp van een preg_match.
<?php
	function doAbbriviates($f_html, $f_abbr = array())
	{
		$result = '';
		$matches = array();
		preg_match_all('/<[^>]+>|[^<]+/i', $f_html, $matches);
		for($i = 0; $i < sizeof($matches[0]); $i++)
		{
			if(substr($matches[0][$i], 0, 1) == '<') // Tag
			{
				$result .= $matches[0][$i];
			}
			else
			{
				$words = explode(' ', $matches[0][$i]);
				for($j = 0; $j < sizeof($words); $j++)
				{
					if(empty($f_abbr[$words[$j]]))
					{
						if(preg_match("/\((.*)\)/i",$words[$j],$newvar))
						{
													$words[$j] = '('.$this->doAbbriviates($newvar[1], $f_abbr).')';
						}
						else
						{
							$words[$j] = $words[$j];
						}
					}
					else
					{
						$words[$j] = '<abbr title="' . htmlentities($f_abbr[$words[$j]]) . '"><span class="abbr" title="' . htmlentities($f_abbr[$words[$j]]) . '">' . $words[$j] . '</span></abbr>';
					}
				}
				$result .= implode(' ', $words);
			}
		}
		return $result;
	}
?>

Indien er toch nog tips zijn, dan zijn die meer dan welkom.
p.s. nog 1 vraag. kan ik niet beter een preg_match_all gebruiken ipv preg_match
Derde keer: Niet Bumpen.
Bumpen:
Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de knop om je tekst aan te passen.

SanThe.

Reageren