1

我想找到任何匹配的东西

[^1] and [/^1]

例如,如果主题是这样的

sometext[^1]abcdef[/^1]somemoretext[^2]12345[/^2]

我想取回一个以 abcdef 和 12345 作为元素的数组。

我读了这个

我写了这段代码,我无法在 [] 之间推进过去的搜索

<?php


$test = '[12345]';

getnumberfromstring($test);

function getnumberfromstring($text)
{
    $pattern= '~(?<=\[)(.*?)(?=\])~';
    $matches= array();
    preg_match($pattern, $text, $matches);

    var_dump($matches);
}

?>
4

3 回答 3

1

您的测试检查'[12345]'不适用于具有 的“开”[^digit]和“闭”的规则的字符串[\^digit]。此外,您在preg_match应该使用时使用:preg_match_all

试试这个:

<?php


$test = 'sometext[^1]abcdef[/^1]somemoretext[^2]12345[/^2]';

getnumberfromstring($test);

function getnumberfromstring($text)
{
    $pattern= '/(?<=\[\^\d\])(.*?)(?=\[\/\^\d\])/';
    $matches= array();
    preg_match_all($pattern, $text, $matches);

    var_dump($matches);
}

?>
于 2012-08-02T04:00:28.060 回答
1

其他答案并不真正适用于您的情况;您的定界符更复杂,您必须使用开始定界符的一部分来匹配结束定界符。此外,除非标签内的数字限制为一位,否则您不能使用后向匹配来匹配第一个数字。您必须以正常方式匹配标签并使用捕获组来提取内容。(无论如何我都会这样做。Lookbehind 永远不应该是您使用的第一个工具。)

'~\[\^(\d+)\](.*?)\[/\^\1\]~'

起始分隔符的数字被捕获在第一组中,并且反向引用\1匹配相同的数字,从而确保分隔符正确配对。分隔符之间的文本在组 #2 中捕获。

于 2012-08-02T04:04:04.597 回答
0

我在 php 5.4.5 中测试了以下代码:

<?php
$foo = 'sometext[^1]abcdef[/^1]somemoretext[^2]12345[/^2]';    
function getnumberfromstring($text)
{    
    $matches= array();
    # match [^1]...[/^1], [^2]...[/^2]
    preg_match_all('/\[\^(\d+)\]([^\[\]]+)\[\/\^\1\]/', $text, $matches, PREG_SET_ORDER);    
    for($i = 0; $i < count($matches); ++$i)
        printf("%s\n", $matches[$i][2]);
}
getnumberfromstring($foo);

?>

输出:

abcdef
123456
于 2012-08-02T04:01:55.263 回答