修剪PHP正则表达式中的子字符串

时间:2014-01-07 15:30:39

标签: php regex whitespace

我有一个字符串,其中可能包含如下模式:

LINK([anchor text],[link])

我想要做的是将此表达式转换为HTML链接:

<a href="link">anchor text</a>

目前,我正在使用以下PHP代码段执行替换:

$string = 'LINK(  some anchor text    ,   http://mydomain.com  )';
$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';
$replace = '<a href="$2">$1</a>';
preg_replace($search, $replace, $string);

我面临的问题是锚文本之后的空格。幸运的是,在HTML中,多个空格被解释为单个空格,但在此示例中,我将显示带有(带下划线)恼人空间的链接。有没有办法修剪这个锚文本?我不能把它当作“链接”子串,因为它可能包含空格。

3 个答案:

答案 0 :(得分:2)

假设锚文本不能包含逗号或连续多于1个空格,您可以使用:

LINK\s*\(\s*([^\s,]+(?:\s[^\s,]+)*)\s*,\s*(\S+)\s*\)

regex101 demo

而不是.+,我使用的[^\s,]+(?:\s[^\s,]+)*将匹配一个单词,更多的单词用空格分隔(其中一个单词是一系列至少包含一个字符的非空格字符)

同时更改了您在[^\s]稍后显示的否定课程\S

答案 1 :(得分:1)

你可以让相关的量词 lazy ,他们不会在,)之前占用空格:

'/LINK\(\s*(.+?)\s*,\s*([^\s]+?)\s*\)/'

?之后添加+

Test

答案 2 :(得分:1)

在这种情况下你可以做的是将第一组改为懒惰地分组。

$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';

可以更改为:

$search = '/LINK\s*\(\s*(.+?)\s*,\s*([^\s]+)\s*\)/';

注意加号后面的问号。这告诉程序使用最少的字符数来匹配它。

在这种情况下,它可以匹配的 laziest 是一个字符串,后跟任意数量的空格,然后是逗号。

在原始情况下,它会匹配贪婪。这意味着它会尝试匹配可能的最大字符数,从而导致.+匹配所有字符,直到逗号。

以下是代码的a regex101