Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
suchen nach nichtvorhanden sein [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
suchen nach nichtvorhanden sein


 
Postaria
21-04-2009, 11:10 
 
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.


$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.

versuche anscheinend wiedereinmal an der falschen stelle zu suchen
habe schon mit preg_match_all eine Funktion gefunden die mir annähernd rankommt. Kriege jedoch nicht den Verweis raus der eben das Attribut nicht beinhaltet.

Könnt ihr mir da mal wieder unter die Arme greifen?

Vielen Dank im Vorraus.

Postaria

 
Kropff
21-04-2009, 11:19 
 
habe schon mit preg_match_all eine Funktion gefunden
und wie sieht die aus?

peter

 
onemorenerd
21-04-2009, 11:54 
 
Wenn der String immer so aussieht, kannst du auch mit explode(), strpos(), implode() usw. arbeiten. Geht oft besser von der Hand.

 
fireweasel
23-04-2009, 12:55 
 
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.


$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.


$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" (http://www.php.net/manual/en/regexp.reference.php#regexp.reference.conditional) spielen, aber dir würde ich eher empfehlen, die Callback-Funktion entsprechend anzupassen. Die Backreferences (http://www.php.net/manual/en/regexp.reference.php#regexp.reference.back-references) ('\\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() (http://fireweasel.blogspot.com/2009/04/function-debugwriteflnh.html) zur Kontrollausgabe kann man notfalls durch irgendwas Selbstgebasteltes mit var_dump() (http://php.net/manual/en/function.var-dump.php) ersetzen.

 
Postaria
04-05-2009, 15:01 
 
danke fireweasel
deine Funktion kommt etwas zu spät....
Ist aber mein Fehler.
ich habe es nun so gelöst das ich jeden einzelnen <a ></a> in ein Array packe, daraufhin jedes array element nach name durchsuche und bei nichtvorhandensein name hinzufüge und dann zu einem string wieder zusammenbastel.

klingt ziemlich kompliziert war aber auf die schnelle nicht anders zu lösen.

Danke an euch alle
hmm eventuell kann ich die Funktion aber dennoch gebrauchen fireweasel....


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:23 Uhr.