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

带通配符的PHP正则表达式查找

带通配符的PHP正则表达式查找,php,regex,regex-lookarounds,Php,Regex,Regex Lookarounds,我在PHP中有两个字符串: $string = '<a href="http://localhost/image1.jpeg" /></a>'; $string=''; 及 $string2='[caption id=“attachment_5”align=“alignnone”width=“483”][/caption]; 我正在尝试匹配第一种类型的字符串。这是没有被“[caption…]”和“[/caption]”包围的字符串。到目前为止,我想使用以下内容:

我在PHP中有两个字符串:

$string  = '<a href="http://localhost/image1.jpeg" /></a>';
$string='';

$string2='[caption id=“attachment_5”align=“alignnone”width=“483”][/caption];
我正在尝试匹配第一种类型的字符串。这是没有被“[caption…]”和“[/caption]”包围的字符串。到目前为止,我想使用以下内容:

$pattern = '/(?<!\[caption.*\])(?!\[\/caption\])(<a.*><img.*><\/a>)/';
$pattern='/(?)/';
但是PHP也将第一个字符串与此模式匹配,即使它前面没有“[caption”和零个或多个字符后跟“]”。有什么好处?为什么会这样?正确的模式是什么


谢谢。

PHP不支持可变长度查找,因此模式的这一部分无效:

(?<!\[caption.*\])
在匹配包含
/
的图案时,请使用另一个字符作为图案分隔符,以避免出现倾斜牙签综合症。您几乎可以在模式周围使用任何非字母数字字符

更新:前面的正则表达式基于您给出的示例正则表达式,而不是示例数据。如果要匹配不包含图像的链接,请执行以下操作:

$pattern = '|(<a[^>]*>[^<]*</a>)(?!\[/caption\])|';

$pattern='|(]*>[^PHP不支持可变长度查找,因此模式的这部分无效:

(?<!\[caption.*\])
当匹配包含
/
的图案时,请使用另一个字符作为图案分隔符,以避免出现倾斜牙签综合症。图案周围几乎可以使用任何非字母数字字符

更新:上一个正则表达式基于您给出的示例正则表达式,而不是示例数据。如果要匹配不包含图像的链接,请执行以下操作:

$pattern = '|(<a[^>]*>[^<]*</a>)(?!\[/caption\])|';

$pattern='|(]*>[^Lookbehind不允许非定长模式,即(*,+,?),我认为这
/(?!\[\/caption\])/
足以满足您的要求

Lookbehind不允许非定长模式,即(*,+,?),我认为这
/(?!\[\/caption\]))/
足以满足您的要求

我不知道您的regexp如何匹配这两个字符串,因为您正在寻找


编辑:根据dan1111的建议删除了无用的前瞻,并更新了regex101链接。

我不知道您的regexp如何匹配这两个字符串,因为您正在查找


编辑:根据dan1111的建议删除了无用的前瞻,并更新了regex101链接。

为什么不尝试匹配以解决方案开头的字符串为什么不尝试匹配以解决方案开头的字符串将不匹配他的第一个字符串
@zb226,感谢您指出这一点。中的正则表达式之间存在不匹配问题和样本数据,我的答案基于正则表达式。您的解决方案与他的第一个字符串
@zb226不匹配,谢谢您指出。问题中的正则表达式与样本数据不匹配,我的答案基于正则表达式。这是错误的;前瞻需要在模式中的某个点上您希望它匹配(字符串的结尾,而不是开头)。消极的前瞻总是令人满意的,因为它开始查看
在preg_match中尝试这样做,我做了,它成功了。同时在这里测试它,它甚至没有排除问题中不应该匹配的示例:在链接位于更大文件中的真实示例中,它肯定不起作用。@GeraldSv——如果您实际上,转到我提供的链接,您将看到全局选项没有任何区别(也没有任何理由认为它会——它控制执行的匹配数量,而不是单个匹配的行为)。如果在全局设置关闭的情况下在两个字符串上测试它,它将只与第一个字符串匹配。但这是一个巧合,因为它只匹配一次,而应该匹配的字符串恰好是第一个。这是不正确的;向前看需要位于您希望它匹配的模式中的点(字符串的结尾,而不是开头)。消极的前瞻总是令人满意的,因为它开始查看
在preg_match中尝试这样做,我做了,它成功了。同时在这里测试它,它甚至没有排除问题中不应该匹配的示例:在链接位于更大文件中的真实示例中,它肯定不起作用。@GeraldSv——如果您实际上,转到我提供的链接,您将看到全局选项没有任何区别(也没有任何理由认为它会——它控制执行的匹配数量,而不是单个匹配的行为)。如果在全局设置关闭的情况下在两个字符串上测试它,它将只匹配第一个字符串。但这是巧合,因为它只匹配一次,而应该匹配的字符串恰好是第一个。
$pattern = '/(<a[^>]*>(<img[^>]*>)?<\/a>)(?!\[\/caption\])/'