2012-04-06 10 views
0

Ich habe ein Array mit Werten, die von einem Wort gebildet werden können oder mehrere, die Sätze erstellen. Jeder Wert dieses Arrays kann auch HTML-Tags haben. Ich möchte nur diejenigen vergleichen, die nicht mit einem HTML-Tag beginnen und das Wort im Array ersetzen.preg_replace exclude "beginnt mit"

Ich bin auf der Suche nach "wie".

"how it's made" 

wird

"<b>how</b> it's made" 

während

<span style="somethig:value">how it's made</span> 

sollte unangetastet bleiben.

ich versuchte, diesen

$words_result = preg_replace('/^(?!<span).*('.$word.')/', '<b>$1</b>', $words_result); 

aber ich habe immer Mixe Ergebnisse erhalten, und ich weiß nicht, es zu debuggen. Außerdem habe ich immer Probleme mit Regex-Ausdrücken: D Zum Beispiel, was ist der Korrespondent $ N Ich sollte verwenden, wenn der Ausdruck übereinstimmt?

Vielen Dank

Antwort

1

Die Dollarzahlen stehen für die von Ihnen hinzugefügten Klammern. $ 1 ist was auch immer es in der ersten Klammer innerhalb der Regex erfasst hat, $ 2 entspricht der zweiten Klammer usw. In vielen Regex-Engines enthält $ 0 das ganze Match. In diesem Fall würden Sie Ihr erstes Wort in $ 1 speichern.

Welchen Wert hat die Variable $word? Es könnte funktionieren, $word durch \w+ und .* durch .*? zu ersetzen. Das Fragezeichen ist erforderlich, um die Zeit greifen so wenige Symbole wie möglich für die Gesamtlaufzeit angepasst zu machen (für weitere Informationen, haben einen Blick auf this Regex reference und vergleichen * mit *?)

Edit: Basierend auf Ihren Kommentar, Ihre tatsächlichen Problem ist, dass Ihre Regex alles vom Anfang der Zeile bis zu Ihrem Wort übereinstimmt und Sie ersetzen alle davon mit <b>(word)</b>. Was Sie versuchen könnten ist .* in Klammern setzen: (.*), so dass Sie jetzt erhalten: $1 enthält alles bis zu das Wort, und $2 enthält das Wort selbst. Dann ersetze die Zeichenfolge '$1<b>$2</b>'.

+0

also sollte ich etwas ändern? meins passt nur zu denen, die nicht ohne wie es ist gemacht" *. Warum schneidet es vorher ab? –

+0

Ich habe die Antwort ein wenig angepasst :-) – Armatus

+0

$ word ist ein präzises Wort, das aus einem Array innerhalb einer Foreach abgerufen wird –

1

Ich fehle hier etwas Vielleicht, aber es scheint wie eine einfache Möglichkeit, dies zu lösen, ist nur das erste Zeichen für eine spitze Klammer zu überprüfen:

$phrases = array(
    "how it's made", 
    "another phrase", 
    "<b>Eat the food, Tina!</b>", 
    "<i>Fizz</i><u>buzz</u>" 
); 
foreach ($phrases as $index => $phrase) { 
    if ($phrase[0] == '<') 
     continue; 
    $replacement = preg_replace('/^([A-Za-z0-9]+)/', '<b>$1</b>', $phrase); 
    $phrases[$index] = $replacement; 
} 

ich alle bin für Over-Engineering zu vermeiden wenn möglich. :)

EDIT: Der Pseudo-Code entfernt und mit echtem PHP ersetzt.

+0

"Ich kann nicht" tun, weil sowohl Muster und Themen sind Werte in Arrays mit zufälliger Länge –

+0

Ich fürchte, ich verstehe nicht, was du meinst ... Wie in, das Array $ Phrasen ist eine unbekannte Länge ? Oder jede '$ Phrase' ist eine unbekannte Länge? Spielt das eine Rolle? –

+0

Ich meine, dass die Arrays unterschiedliche Indizes in Zahlen haben können, aber es ist nicht relevant :) Wie auch immer warum [code] $ phrases [0] == "<" [code]? . Ich muss jede Phrase des Arrays verarbeiten, die/html nicht startet. Außerdem kommt das Muster '$ 1' von einer Reihe von Wörtern. Ich muss jedes Wort für jeden Wert von $ Phrasen parsen. Ich nehme an, ich brauche am Ende eine Schleife in eine Schleife. Ich dachte, preg_replace könnte das alles vermeiden, weil es passende Muster ersetzen und den entsprechenden Array-Schlüssel ersetzen kann :) –