正则表达式 - 如何一次匹配一个模式

时间:2013-03-05 10:24:48

标签: php regex

我已经解析了一些内容来检索自制链接标记并将其转换为普通链接标记。

可能的输入:

<p>blabalblahhh <moolinkx pageid="121">text to click</moolinkx> blablabah</p>

输出:

<p>blabalblahhh <a href="whateverpage.htm">text to click</a> blablabah</p>

这是我的代码:

$regex = '/\<moolinkx pageid="(.{1,})"\>(.{1,})\<\/moolinkx\>/';
preg_match_all( $regex, $string, $matches );

如果字符串中只有一个,它的效果非常好。但是只要有第二个,它就不起作用。

输入:

<p>blabalblahhh <moolinkx pageid="121">text to click</moolinkx>  blablabah.</p>
<p>Another <moolinkx pageid="128">text to clickclick</moolinkx> again blablablah.</p>

这是我在print_r($ matches)时得到的:

Array
(
[0] => Array
    (
        [0] => <moolinkx pageid="121">text to click</moolinkx>  blablabah.</p><p>Another <moolinkx pageid="128">text to clickclick</moolinkx>
    )

[1] => Array
    (
        [0] => 121">text to click</moolinkx>  blablabah.</p><p>Another <moolinkx pageid="128
    )

[2] => Array
    (
        [0] => text to clickclick
    )

)

我对正则表达式并不放心,所以它必须是非常微不足道的......但我无法确定它是什么:(

非常感谢你!

注意:这是我在这里的第一篇文章,虽然我已经使用了这个了不起的Q&amp; A多年了!

2 个答案:

答案 0 :(得分:1)

您正在使用贪婪选择器,它将第一个打开标记和最后一个结束标记之间的所有内容识别为标记之间的内容。将正则表达式更改为:

$regex = '/\<moolinkx pageid="(.+?)"\>(.+?)\<\/moolinkx\>/';
preg_match_all( $regex, $string, $matches );

请注意.{1,}已更改为.+?+表示一个或多个实例,?告诉正则表达式选择表达它的最少字符。

答案 1 :(得分:1)

使用否定正则表达式:
$regex = '/<moolinkx pageid="([^"]+)">([^<]+)<\/moolinkx>/';

在此解释演示:http://regex101.com/r/sI3wK5