2017-12-19 6 views
0

Ich habe ein Problem mit dem Schreiben des korrekten regulären Ausdrucks.Shortcodes/BBcode regulärer Ausdruck

Ich verwende Shortcodes in meinem System und sie funktionieren einfach großartig. Ich habe seine Attribute usw. sortiert, aber jetzt möchte ich einen Shortcode innerhalb des anderen Shortcodes verwenden.

Hier ist, wie ich den regulären Ausdruck bereite mich darauf vor:

$attributes_regexp = "([^\]]*?)"; 
$inner_content_regexp = "(.*?)"; 
$flags_regexp = "im"; 
$regexp = "/\[$shortcode$attributes_regexp\]$inner_content_regexp\[\/$shortcode\]/$flags_regexp"; 
preg_match_all($regexp, $content, $found_occurrences); 

Hier ist, wie ein Beispiel eines fertig regulären Ausdruck wie folgt aussieht:

\[file([^\]]*?)\](.*?)\[\/file\] 

Und hier ist ein bisschen von HTML, die sein müssen analysiert:

<div class="row"> 
<div class="col-md-8"> 
<h2>Test page</h2> 
<p>&nbsp;</p> 
<p><strong>Some</strong> content</p> 
<p>Lorem ipsum dolor.&nbsp;</p> 
<p>Dolor sit amet.</p> 
<p>[file id=290 type=link][file id=283 type=image width=100 height=100][/file][/file]</p> 
</div> 
<div class="col-md-3 offset-md-1"> 
<p>[file id=289 type=image][/file]</p> 
</div> 
</div> 

Das Problem ist, dass es richtig nur die letzte ch wird Angeht es das Bild, aber die vorherigen wie

[Datei-ID = 290 type = link] [id = 283 type = Bildbreite = 100 height = 100 file] [/ file] genommen wird

Anstelle von zwei getrennten diejenigen

[Datei-ID = 283 type = Bildbreite = 100 height = 100] [/ file]

und

[file id = 290 type = link] [/ file]

Irgendwelche Ideen, wie dies kann sortiert werden?

Vielen Dank, Tomasz

+0

Also Sie Regex verwenden, um etwas wie '[Datei-ID = 289 Typ = Bild] [/ Datei]' mit einem Img-Tag, das die richtigen Attribute hat zu ersetzen? – Marathon55

+0

Ja, und es funktioniert sehr gut. Aber jetzt muss ich einen im anderen ersetzen. Problem ist, dass sie beide gleich sind. – MrTomAsh

Antwort

2

Wenn die Daten nur bremst den XML-Standard mit dem Tag Separatoren [ und ] statt < und > Sie die Daten in XML verwandeln konnte und einen XML-Parser für die weitere Analyse verwendet werden:

$regex = "/(\[{$shortcode}.+\[\/{$shortcode}\])/"; 
if (preg_match_all($regex, $content, $matches)) { 
    array_shift($matches); //removes $matches[0], which contains the whole $content again 
    foreach ($matches as $match) { 
     //The following line should turn your data into valid XML 
     $xml = str_replace(['[', ']'], ['<', '>'], $match); 
     //Some XML parsing like: 
     $xmlObject = new SimpleXMLElement($xml); 
     //... 
    } 
} 

So müssen Sie das Rad nicht neu erfinden.

+0

Danke, basierend auf Ihrer Lösung habe ich meinen Code neu gestaltet, da ich das Ganze nicht von Grund auf neu schreiben wollte. Jetzt suche ich zuerst nach Tags dank Ihrer Regexp und dann verarbeite ich sie mit meiner Regexp und reverse das Array um von rechts nach links zu arbeiten und es funktioniert. Vielen Dank! – MrTomAsh