2

我有这个函数可以解析一些内容以检索自制链接标签并将其转换为普通链接标签。

可能的输入:

<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
    )

)

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

非常感谢您!

注意:这是我在这里的第一篇文章,尽管我多年来一直在使用这个很棒的问答!

4

2 回答 2

1

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

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

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

于 2013-03-05T10:30:29.003 回答
1

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

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

于 2013-03-05T10:55:15.240 回答