PHP:获取某个占位符之间的字符串的最佳方法是什么

时间:2012-05-04 05:52:30

标签: php

我想知道是否有人可以帮助我

我有这段代码在[回复]

之间获取一些文字
$msg    =   '> **
>   <#1371620c479a4e98_>  Chauffeure -Emails  driver_age:72
> driver_nationality:IN
> driver_languages:French,
> driver_name:Rinto George
> driver_mobilenumber:9747 161861
> driver_email:rinto@example.com[reply]I am a principal yes , I know
> you[reply]  Fragen oder Hilfe benotigt?
> 089-38168530 Secure Transmission of Sensitive Data by SSL
>';

使用过的代码

preg_match_all("/\[reply](.*)\[reply]/", $msg, $reply); 
print_r($reply)

但它不会输出我想要的输出

建议

如果您可以使用[回复]进行排序,请回复此处[/ reply]会更好,因为我正在使用[回复] [回复],看起来不太好

4 个答案:

答案 0 :(得分:0)

你不想要正则表达式。虽然你可以通过简单的正则表达式(例如发布的webbandit)完成最基本案例的尝试,但它会打破更复杂的例子(如我的评论中的那个)。

这可以通过更好的正则表达式和前瞻来解决,但这不是你想要的。你正在进行字符串匹配,你应该使用有限的机器来解决这个问题。 PHP的字符串算法可以为您提供快速而肮脏的功能,例如。

<?php

$text = "[reply] something [reply] bla bla bla [reply] something else [reply]";

$matches = array();
$lastMatch = 0;
$matchCount = 0;

$search = "[reply]";

while(true) {
    $thisMatch = strpos($text, $search, $lastMatch+1);
    if($thisMatch === FALSE)
        break;
    if(++$matchCount % 2 == 0)
    {
        $lastMatch = $thisMatch;
        continue;
    }
    //print substr($text, $lastMatch + strlen($search), $thisMatch - $lastMatch - strlen($search)) . "\n";
    array_push($matches, substr($text, $lastMatch + strlen($search), $thisMatch - $lastMatch - strlen($search)));
    $lastMatch = $thisMatch;
}

print_r($matches);

?>

将在$matches中为您提供一系列回复。

输出:

[mqudsi@iqudsi:~/Desktop]$ php reply.php 
Array
(
    [0] =>  something 
    [1] =>  something else 
)

对于[reply][/reply]的修订问题,解决方案在此处:

$text = "[reply] something [/reply] bla bla bla [reply] something else [/reply]";

$matches = array();
$end = -1;

while(true) {
    $start = strpos($text, "[reply]", $end+1);
    $end = strpos($text, "[/reply]", $start+1);
    if($start === FALSE || $end === FALSE)
        break;

    array_push($matches, substr($text, $start + strlen("[reply]"), $end - $start - strlen("[reply]")));
    $lastMatch = $thisMatch;
}

答案 1 :(得分:0)

取正则数组结果的正则表达式过滤器/\[reply\].*/会给你你想要的东西

这里是结果

Array
(
    [0] => Array
        (
            [0] => [reply]I am a principal yes , I know
            [1] => [reply]  Fragen oder Hilfe benotigt?
        )

)

答案 2 :(得分:0)

Dunno为什么Gokhan删除了他的答案,但这是正确的答案。

"~\[reply](.*?)\[/reply]~is"

您需要的唯一两件事是s修饰符,它告诉regexp将表达式应用于整个文本,而不是单独的每个字符串(默认情况下) 和贪婪限制器?

答案 3 :(得分:-1)

正则表达式是:/\[reply\]([^\[]+)\[\/reply\]/g