2012-04-08 11 views
0

Ich habe etwas Text, der in [quote][/quote] gewickelt ist und ich versuche, den gesamten Text vor diesen Tags, alles zwischen diesen Tags und alles nach diesen Tags zu vergleichen. Der Haken ist, dass es mehrere Vorkommen von ihnen geben kann, aber nicht ineinander.preg_match_all wird komisch

Der Grund für mich ist, weil ich einen Filter für den gesamten Text außerhalb dieser Tags ausführen möchte, ob mehrere Vorkommen vorhanden sind oder nicht.

Dies ist, was ich beginne, mit zu arbeiten:

preg_match_all("/(^.*)\[quote\](.*?)\[\/quote\](.*)/si", $reply['msg'], $getthequotes); 

Hier ist der Ausgang:

Array 
(
[0] => Array 
    (
     [0] => putting some stuff before the quote 
[quote][b]Logan said[/b][br]testing this youtube link http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA[br][br]did it work?[br][br][i]04/04/12 23:48:46: Edited by Logan(2)[/i][br][br][i]04/04/12 23:55:44: Edited by Logan(2)[/i][/quote] 

yep 

http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA 

adding a quote 

[quote][b]Logan said[/b][br]This is the start of the second quote http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA[br][br]did it work?[br][br][i]04/04/12 23:48:46: Edited by Logan(2)[/i][br][br][i]04/04/12 23:55:44: Edited by Logan(2)[/i][/quote] 

[i]04/07/12 20:18:07: Edited by Logan(2)[/i] 
    ) 

[1] => Array 
    (
     [0] => putting some stuff before the quote 

[quote][b]Logan said[/b][br]testing this youtube link http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA[br][br]did it work?[br][br][i]04/04/12 23:48:46: Edited by Logan(2)[/i][br][br][i]04/04/12 23:55:44: Edited by Logan(2)[/i][/quote] 

yep 

http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA 

adding a quote 


    ) 

[2] => Array 
    (
     [0] => [b]Logan said[/b][br]This is the start of the second quote http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA[br][br]did it work?[br][br][i]04/04/12 23:48:46: Edited by Logan(2)[/i][br][br][i]04/04/12 23:55:44: Edited by Logan(2)[/i] 
    ) 

[3] => Array 
    (
     [0] => 

[i]04/07/12 20:18:07: Edited by Logan(2)[/i] 
    ) 

) 

Wie Sie es nicht immer die gewünschte Ausgabe sehen. Jede Hilfe wäre willkommen.

+0

Ahh ... eine Markup-Sprache, die nicht HTML ist - sicherlich Regexes endlich das richtige Werkzeug sein? –

+0

Ich habe benutzerdefinierte BBCode wie Tags, die in HTML geparst werden. Das Regex-Parsing erfolgt in PHP. –

+1

Es tut mir leid, ich war ein bisschen sarkastisch, angesichts dieses [extrem weit verbreiteten Irrtums] (http://stackoverflow.com/a/1732454/596781). Die Antwort ist, * benutze keine Regexes dafür, da sie nicht das richtige Werkzeug sind. –

Antwort

1

Ich habe dies nicht versucht, aber Sie wollen nur die Sachen vor [quote] und nach [/quote], könnten Sie eine strpos für das erste Vorkommen der Eröffnung Zitat Tag tun. Jetzt weißt du alles bevor nicht zitiert wird.

Als Nächstes können Sie strpos beginnend mit dem Index des ersten übereinstimmenden Zitat-Tags verwenden, um das schließende Zitat-Tag zu finden. Sie können dieses Zeug verwerfen.

Führen Sie nun einen weiteren strpos für den nächsten Zitatblock mit einer Startposition des gerade gefundenen schließenden Quote-Tags aus. Sie können dies bis zum Ende wiederholen.

+0

Auch, wenn Sie * n * wollen, suchen Sie nach dem ersten '[/ quote]' zuerst, dann suchen * rückwärts * von dort nach dem öffnenden '[quote]' - das gibt Ihnen das innerste Zitat. Formatieren Sie es wie nötig, spülen Sie es aus und wiederholen Sie es. – mpen

+0

Ich werde alles brauchen. Ich brauche nur zusätzliche Verarbeitung für nicht zitierten Text. Ich schätze, ich könnte das tun, indem ich jedes in seiner eigenen var speichere und dann alle Teile wieder zusammenfüge ... irgendwie Arsch rückwärts, aber ich denke, es würde funktionieren. –

+0

Ja, es sollte funktionieren, wenn Sie die Teile wieder zusammenfügen. Das tut mir leid. Ja, es ist eine Art naive Algorithmus, aber es sollte nicht zu langsam für Ihre Zwecke sein. Ich glaube, ich habe diese Idee von der Udacity 101-Klasse bekommen, wo sie Links in einer HTML-Seite mit einem ähnlichen Ansatz analysiert haben. – Gohn67

0

Es kann getan werden, aber Sie müssen mehrere Durchläufe über die Zeichenfolge vornehmen.

$string = 'putting some stuff before the quote 
[quote][b]Logan said[/b][br]testing this youtube link http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA[br][br]did it work?[br][br][i]04/04/12 23:48:46: Edited by Logan(2)[/i][br][br][i]04/04/12 23:55:44: Edited by Logan(2)[/i][/quote] 

yep 

http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA 

adding a quote 

[quote][b]Logan said[/b][br]This is the start of the second quote http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA[br][br]did it work?[br][br][i]04/04/12 23:48:46: Edited by Logan(2)[/i][br][br][i]04/04/12 23:55:44: Edited by Logan(2)[/i][/quote] 

[i]04/07/12 20:18:07: Edited by Logan(2)[/i]putting some stuff before the quote 

[quote][b]Logan said[/b][br]testing this youtube link http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA[br][br]did it work?[br][br][i]04/04/12 23:48:46: Edited by Logan(2)[/i][br][br][i]04/04/12 23:55:44: Edited by Logan(2)[/i][/quote] 

yep 

http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA 

adding a quote'; 

//get rid of whitespace 
$string = preg_replace('%\s\s?%', " ",$string); 
//break the string on a common element 
$pieces = preg_split('%\[%',$string); 
//now discard the elements that are tags 
foreach($pieces as $key=>$value): 
    $value = trim($value); 
    if(strrpos($value,"]") == (strlen($value) -1)): 
     unset($pieces[$key]); 
    endif; 
endforeach; 
print_r($pieces); 
//and finally strip out the tag fragments 
foreach($pieces as $key=>$value): 
    $pieces[$key] = preg_replace('%.*]%',"",$value); 
endforeach; 

Das Ergebnis ist ein Array, das wie folgt aussieht:

Array 
(
    [0] => putting some stuff before the quote 
    [2] => Logan said 
    [4] => testing this youtube link http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA 
    [6] => did it work? 
    [9] => 04/04/12 23:48:46: Edited by Logan(2) 
    [13] => 04/04/12 23:55:44: Edited by Logan(2) 
    [15] => yep http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA adding a quote 
    [17] => Logan said 
    [19] => This is the start of the second quote http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA 
    [21] => did it work? 
    [24] => 04/04/12 23:48:46: Edited by Logan(2) 
    [28] => 04/04/12 23:55:44: Edited by Logan(2) 
    [31] => 04/07/12 20:18:07: Edited by Logan(2) 
    [32] => putting some stuff before the quote 
    [34] => Logan said 
    [36] => testing this youtube link http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA 
    [38] => did it work? 
    [41] => 04/04/12 23:48:46: Edited by Logan(2) 
    [45] => 04/04/12 23:55:44: Edited by Logan(2) 
    [47] => yep http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=g-music&context=G2db8219YMAAAAAAAAAA adding a quote 
)