preg_match_all变得怪异

时间:2012-04-08 00:32:47

标签: php regex

我有一些文本包含在[quote][/quote]中,我试图匹配这些标记之前的所有文本,这些标记之间的所有内容以及这些标记之后的所有内容。问题在于它们可能有多次出现,但彼此之间并不存在。

我这样做的原因是因为我想对这些标签之外的所有文本运行过滤器,无论是否多次出现。

这是我开始使用的:

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

这是输出:

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]
    )

)

正如您所看到的,它没有获得所需的输出。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:1)

我没有试过这个,但你只想要[quote]之前和[/quote]之后的东西,你可以为第一次出现的开始引用标记做一个strpos。现在你知道以前的一切都没有被引用。

接下来,您可以从第一个匹配的引用标记的索引开始使用strpos来查找结束引用标记。你可以丢弃这些东西。

现在使用您刚刚找到的结束引号标记的起始位置为下一个引用块执行另一个strpos。你可以重复这个,直到你结束。

答案 1 :(得分:0)

可以这样做,但你需要对字符串进行多次传递。

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

结果是一个如下所示的数组:

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
)