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

PHP:获取某个palceholder之间的字符串的最佳方法是什么,php,Php,我想知道是否有人能帮我 我有这个代码,可以在[reply]之间获取一些文本 $msg = '> ** > <#1371620c479a4e98_> Chauffeure -Emails driver_age:72 > driver_nationality:IN > driver_languages:French, > driver_name:Rinto George > driver_mobilenumber:9747 16186

我想知道是否有人能帮我

我有这个代码,可以在[reply]之间获取一些文本

$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
>';
但是它没有输出我想要的输出

建议


如果您可以在这里使用[reply]reply[/reply]来解决这个问题,会更好,因为我使用的是[reply][reply],看起来格式不好的正则表达式是:
/\[reply\]([^\[]+)\[\/reply\]/g

你不需要正则表达式。虽然你可以用一个简单的正则表达式(如webbandit发布的正则表达式)来完成你在最基本的情况下所要做的事情,但它会突破更复杂的例子(如我评论中的例子)

这可以通过更好的正则表达式和lookaheads来解决,但这不是你想要的。你正在进行字符串匹配,你应该使用有限机器来实现。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);

?>

对于您用
[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;
}

获取正则表达式过滤器的奇数数组结果
/\[reply\]./
将为您提供所需内容

这里是结果

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

)

不知道戈汗为什么删除了他的答案,但这是正确的答案

"~\[reply](.*?)\[/reply]~is"
您只需要两件事:一个
s
修饰符,它告诉regexp将表达式应用于整个文本,而不是单独应用于每个字符串(默认情况下)

贪欲限制器

不太可能。这将在这里打破:
[reply]bla bla[ha]bla bla bla[reply]
。使用正则表达式是个坏主意。看起来是修改过的answe。就像在建议中一样。不,它不会。正则表达式默认情况下是贪心的。它会用
(.*)
,包括其他
[reply]吃掉尽可能多的东西
strings。你想从上面的字符串中得到一个“我是一个负责人是的,我认识你”的函数吗?你唯一需要的是一个
s
修饰符和一个贪婪修饰符。没什么大不了的。请看Gokhan的答案,这是正确的。你也可以使用preg_split()如果你想得到回复和短信between@duke我已经发布了另一个我自己的解决方案,它也有[reply][/reply]功能。它不起作用,给了我致命的错误:允许的内存大小134217728字节耗尽,还有很多其他错误,而(true){OMG,“您不需要正则表达式”是的,你需要一页的代码来代替。是的,这是正确的。如果你想以正确的方式来做,不会因为你没有想到的每一个输入而中断,也就是说。如果你不想你的过程花费半个小时和大量的RAM。这只是一个错误的陈述。事实上,你可能会错误地输入数据,并用它编写错误的代码也有很多字符串函数。@GokhanOzturk编译器不会运行你的循环。循环不会因为太长而停止,只有递归可以在堆栈溢出异常的情况下完成。我打赌这个循环(有一些明显的修复)对于包含200个回复的代码,与您的答案中的正则表达式相比,运行速度更快,内存更少。我的代码不会每次从一开始就读取字符串。在您修复它之前,当我指出字符串错误时,他将其删除。您的答案是正确的,并且比我的答案简单得多。如果bbcode解析不是一个性能敏感的操作,这是一个很好的解决方案如果内存或性能真的很重要,那么是时候为我的答案中的状态机牺牲清晰度和简洁性了。
Array
(
    [0] => Array
        (
            [0] => [reply]I am a principal yes , I know
            [1] => [reply]  Fragen oder Hilfe benotigt?
        )

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