1

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

我有这段代码可以在 [回复] 之间获取一些文本

$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]Reply here[/reply] 来解决它会更好,因为我正在使用 [reply][reply] ,看起来格式不正确

4

4 回答 4

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]and [/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;
}
于 2012-05-04T06:03:44.443 回答
0

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

这里的结果

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

)
于 2012-05-04T06:11:19.557 回答
0

不知道为什么 Gokhan 删除了他的答案,但它是正确的。

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

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

于 2012-05-04T08:23:43.797 回答
-1

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

于 2012-05-04T05:56:52.093 回答