Zitat:
Original geschrieben von Postaria
Hallo Community,
hoffe ihr könnt mir mal wieder vom schlauch helfen, stehe nämlich erneut drauf.
Problem ist das ich einen String habe dem ein attribut fehlt.
PHP-Code:
$string = "<a href='a.html' name='a'>a</a><a href='b.html' name='b' >b</a><a href='c.html' >c</a><a href='d.html' name='d' >d</a> ";
wie zu sehen ist fehlt bei dem dritten Verweis das attribut "name".
ich möchte nun diesen String nach name durchsuchen und bei nichtvorhanden sein hinzufügen.
|
PHP-Code:
$src = "<a href='a.html' name='a'>a</a><a href='b.html' name='b' >b</a>".
"<a href='c.html' >c</a><a href='d.html' name='d' >d</a> ";
// Suchmuster
$pcre = '/(\<a\s+href=\'([a-z]+)\.html\')(\s+name=\'\\2\')?(\s*\>\\2\<\/a\>)/s';
function callback_0815($hits) {
debug::writefln('$hits: %s', $hits);
if ('' !== $hits[3]) {
return $hits[0];
}
return "$hits[1] name='$hits[2]'$hits[4]";
}
$callback = 'callback_0815';
/* pcre testen
debug_writeflnh(
'$hits: %s',
preg_match_all($pcre, $src, $hits, PREG_SET_ORDER) ? $hits : FALSE
);
//*/
$dst = preg_replace_callback($pcre, $callback, $src);
// Ergebnis des Ersetzen-Vorgangs ausgeben:
debug_writeflnh('$dst: %s', $dst);
Da du nicht näher angegeben hast, aus welchen Zeichen sich die Name-Attribute zusammensetzen, hab ich pauschal '/[a-z]+/' angenommen. Außerdem habe ich den Wert aus dem href-Attribut geholt. Möglicherweise wolltest du den Wert aus der Beschreibung (zwischen <a...> und </a>). In dem Fall wird es etwas komplizierter. Man könnte mit
"conditional subpatterns" spielen, aber dir würde ich eher empfehlen, die Callback-Funktion entsprechend anzupassen. Die
Backreferences ('\\1') müssten dann aber auch geändert werden.
--
Nachtrag:
Wie immer den Quellcode bitte aus der Zitatansicht kopieren, sonst gehen einige Backslashes flöten.
Und die Funktion
debug_writeflnh() zur Kontrollausgabe kann man notfalls durch irgendwas Selbstgebasteltes mit
var_dump() ersetzen.