Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修剪PHP正则表达式中的子字符串_Php_Regex_Whitespace - Fatal编程技术网

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

修剪PHP正则表达式中的子字符串,php,regex,whitespace,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*\)

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

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);
$string='链接(一些锚文本,http://mydomain.com  )';
$search='/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';
$replace='';
preg_replace($search,$replace,$string);

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

假设锚文本不能包含逗号或一行中包含多个空格,您可以使用:

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

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


还将随后出现的否定类
[^\s]
更改为
\s

假设锚文本不能包含逗号或一行中包含多个空格,您可能可以使用:

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

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


还将您的否定类
[^\s]
更改为
\s

您可以使相关的量词变懒,这样它们就不会占用
之前的空格了。

+
之后添加


你可以让相关的量词变懒,这样它们就不会占用
之前的空格了。

+
之后添加


在这种情况下,您可以做的是将第一个组更改为惰性组

$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';
可更改为:

$search = '/LINK\s*\(\s*(.+?)\s*,\s*([^\s]+)\s*\)/';
注意加号后面的问号。这告诉程序使用最少的字符数来匹配它

在本例中,它所能匹配的最慢值是字符串,后跟任意数量的空格,然后是逗号

在最初的情况下,这将是贪婪的匹配。这意味着它将尝试匹配尽可能多的字符,从而使
+
匹配所有字符,直到逗号


这是一段代码。

在这种情况下,您可以将第一个组更改为惰性组

$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';
可更改为:

$search = '/LINK\s*\(\s*(.+?)\s*,\s*([^\s]+)\s*\)/';
注意加号后面的问号。这告诉程序使用最少的字符数来匹配它

在本例中,它所能匹配的最慢值是字符串,后跟任意数量的空格,然后是逗号

在最初的情况下,这将是贪婪的匹配。这意味着它将尝试匹配尽可能多的字符,从而使
+
匹配所有字符,直到逗号


这是一段代码。

可能回调中有一些代码来处理修剪,也可能是实际的替换可能是重复的,可能回调中有一些代码来处理修剪,也可能是实际的替换可能是重复的Nice job@Jerry!这就是我要找的。我稍微将模式编辑为
LINK\s*\(\s*([^\s]+(?:\s[^\s]+)*)\s*,\s*(\s+)\s*)
,因为我的意图是在锚文本中也允许逗号。谢谢大家!@乔治好吧,酷!如果没有这些逗号,您可能会得到更多的开销,但如果这使正则表达式更灵活的话!请注意,由于删除了逗号,您实际上可以使用
\S
而不是
[^\S]
:)干得好@Jerry!这就是我要找的。我稍微将模式编辑为
LINK\s*\(\s*([^\s]+(?:\s[^\s]+)*)\s*,\s*(\s+)\s*)
,因为我的意图是在锚文本中也允许逗号。谢谢大家!@乔治好吧,酷!如果没有这些逗号,您可能会得到更多的开销,但如果这使正则表达式更灵活的话!请注意,由于您删除了逗号,您实际上可以使用
\S
而不是
[^\S]
:)因为我认为您和Jonny5是在同一时间编写的,+1也代表您!谢谢。因为我认为你和Jonny5是在同一时间写的,+1也为你!谢谢。@Giorgio Me和Arphrial同时思考:)@Giorgio Me和Arphrial同时思考:)