2017-02-06 5 views
1

Ich habe eine Zeichenfolge, wo ich Hashtags nach einem bestimmten "Kontext", zum Beispiel |product übereinstimmen.Regex zum Teilen von Hashtags, aber ignorieren

Nach |product Ich möchte die Hashtags, die danach sind übereinstimmen.

Das ist also meine vollständige Zeichenfolge |product#houtprint#laserprint|materiaal#hout.

Und das ist mein Regex-Muster bis jetzt \|product(?<product>#[^\|]+). Ich bekomme jetzt eine Übereinstimmung auf #houtprint#laserprint, aber ich möchte eine Übereinstimmung auf ihnen seperat so #houtprint und #laserprint bekommen.

Das ist mein PHP Teil auch:

preg_match_all("~\|".$context."(?<".$context.">#[^\|]+)~", $tags_string, $matches);

Wie kann ich sicherstellen, dass ich die Produkte als separate Gruppen bekommen?

Antwort

2

Sie benötigen einen \G basierte Grenze zu setzen, so dass preg_match_all aufeinander folgenden Hashtags passen könnte (das aufeinander folgen nach dem Teilzeichenfolge Sie angeben):

(?:\|product|\G(?!\A))(?<product>#[^|#]+) 

Nicht sicher, dass Sie wirklich brauchen hier die benannte Capture-Gruppe.

Siehe regex demo

Einzelheiten:

  • (?:\|product|\G(?!\A)) - entweder |product substring (\|product) oder das Ende der letzten erfolgreichen Spiel (\G(?!\A)) (diese Zweige können für eine bessere Leistung getauscht werden)
  • (?<product>#[^|#]+) - ein "Produkt" namens einfangende Gruppe, die entspricht
    • # - ein Hash-Symbol
    • [^|#]+ - ein oder mehr Zeichen anders als | und #.

PHP demo:

$re = '/(?:\|product|\G(?!\A))(?<product>#[^|#]+)/'; 
$str = '|product#houtprint#laserprint|materiaal#hout'; 
preg_match_all($re, $str, $matches); 
print_r($matches["product"]); 
// => Array ([0] => #houtprint [1] => #laserprint) 
Verwandte Themen