Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 - Fatal编程技术网

Php 正则表达式问题:用硬引号或软引号匹配此模式

Php 正则表达式问题:用硬引号或软引号匹配此模式,php,regex,Php,Regex,我有一个很好的正则表达式: $p = '%<a.*\s+name="(.*)"\s*>(?:.*)</a>%im'; 使用[]匹配字符集: $p = "%<a.*\s+name=['\"](.*)['\"]\s*>(?:.*)</a>%im"; $p=“%使用[]匹配字符集: $p = "%<a.*\s+name=['\"](.*)['\"]\s*>(?:.*)</a>%im"; $p=“%试试这个: /<a(?

我有一个很好的正则表达式:

$p = '%<a.*\s+name="(.*)"\s*>(?:.*)</a>%im';

使用
[]
匹配字符集:

$p = "%<a.*\s+name=['\"](.*)['\"]\s*>(?:.*)</a>%im";

$p=“%使用
[]
匹配字符集:

$p = "%<a.*\s+name=['\"](.*)['\"]\s*>(?:.*)</a>%im";
$p=“%试试这个:

/<a(?:\s+(?!name)[^"'>]+(?:"[^"]*"|'[^']*')?)*\s+name=("[^"]*"|'[^']*')\s*>/im
但是使用真正的解析器(比如)肯定比使用正则表达式方法要好。

试试以下方法:

/<a(?:\s+(?!name)[^"'>]+(?:"[^"]*"|'[^']*')?)*\s+name=("[^"]*"|'[^']*')\s*>/im

但是使用一个真正的解析器(比如正则表达式)肯定比使用正则表达式更好。

James的注释实际上是一个非常流行但用于字符串匹配的错误正则表达式。这是错误的,因为它不允许字符串分隔符转义。假设字符串分隔符为“或”,则以下正则表达式有效

$regex = '([\'"])(.*?)(.{0,2})(?<![^\\\]\\\)(\1)';

James注释实际上是一个非常流行但用于字符串匹配的错误正则表达式。它是错误的,因为它不允许转义字符串分隔符。如果字符串分隔符是“或”,则以下正则表达式有效

$regex = '([\'"])(.*?)(.{0,2})(?<![^\\\]\\\)(\1)';

您当前的解决方案不会将锚与“name”(例如
)后面的其他属性相匹配

尝试:

$regex = '%<a\s+\S*\s*name=["']([^"']+)["']%i'; 

$regex='%您当前的解决方案将无法将锚与“name”(例如
)后面的其他属性相匹配

尝试:

$regex = '%<a\s+\S*\s*name=["']([^"']+)["']%i'; 

$regex='%还有另一种方法:

$rgx='~<a(?:\s+(?>name()|\w+)=(?|"([^"]*)"|\'([^\']*)\'))+?\1~i';
$rgx='~。第一个非捕获组在不情愿的加号(
+?
)控制下处理所有“name=value”对的匹配。如果属性名是字面上的
name
,则空组(
()
)不匹配任何内容,然后反向引用(
\1
)再次不匹配任何内容,从而中断循环。(反向引用成功,因为该组参与了比赛,即使它没有使用任何字符。)

每次在组#2中捕获属性值,覆盖上一次迭代捕获的内容。(分支重置构造(
(?|(…)|(…)
使我们能够“重用”group#2以捕获引号内的值,无论它们是哪种类型的引号。)由于循环在出现名称
名称
后退出,因此最终捕获的值对应于该属性


以下是另一种方法:

$rgx='~<a(?:\s+(?>name()|\w+)=(?|"([^"]*)"|\'([^\']*)\'))+?\1~i';
$rgx='~。第一个非捕获组在不情愿的加号(
+?
)控制下处理所有“name=value”对的匹配。如果属性名字面上是
name
,则空组(
()
)不匹配任何内容,然后反向引用(
\1
)再次不匹配任何内容,从而中断循环。(反向引用成功,因为该组参与了比赛,即使它没有使用任何字符。)

每次在第2组中捕获属性值时,都会覆盖上一次迭代中捕获的内容。(分支重置构造(
(?|(…)|(…))
使我们能够“重用”第2组以捕获引号内的值,无论它们是哪种引号。)由于循环在名称
name
出现后退出,因此最终捕获的值对应于该属性


太棒了!非常感谢!最好使用php内置的DOMDocument+SimpleXML或DOMXPath(具体取决于…)如果使用分支重置构造,就不必手动删除引号:
(?|“([^”]*)“|”([^']*)”([^']*))
。非常好!非常有魅力!非常感谢!最好使用php内置的DOMDocument+SimpleXML或DOMPXPath(具体取决于…)。如果使用分支重置构造,则不必手动删除引号:
(?|“([^”]*)“|”([^']*)”([^']*))
.Hi pelms,谢谢你的回复。我尝试了你的正则表达式。不得不转义单引号。$regex='%Feh,对模糊不清的格式表示抱歉。$regex='%Hi pelms,谢谢你的回复。我尝试了你的正则表达式。不得不转义单引号。$regex='%Feh,对模糊不清的格式表示抱歉。$regex='%