Php 为什么这个正则表达式不起作用?

Php 为什么这个正则表达式不起作用?,php,regex,preg-match,Php,Regex,Preg Match,1.txt的内容: Image" href="images/product_images/original_images/9961_1.jpg" rel="disable-zoom:false; disable-expand: false"><img src="im 但我认为: $pattern = '/(images\/product_images\/original_images\/)(.*?)(\.jpg)/i'; 我已经厌倦了尝试这个regexp的一百万个组合。我不知道怎

1.txt的内容:

Image" href="images/product_images/original_images/9961_1.jpg" rel="disable-zoom:false; disable-expand: false"><img src="im
但我认为:

$pattern = '/(images\/product_images\/original_images\/)(.*?)(\.jpg)/i';
我已经厌倦了尝试这个regexp的一百万个组合。我不知道怎么了。请,非常感谢

将其取消冻结:

$pattern = '/(images\/product_images\/original_images\/)([^'"]+)(\.jpg)/i';
把它弄得松松垮垮:

$pattern = '/(images\/product_images\/original_images\/)([^'"]+)(\.jpg)/i';

记住正则表达式是贪婪的。您的第二次捕获
(.*)
表示匹配除新行以外的任何字符(除非处于多行模式)。因此,它可能正在捕获线路的其余部分

您可以按照Wrikken的建议将其取消冻结。但我喜欢确保我能捕捉到我想要的东西。在您的例子中,它看起来像
href
属性的值。所以我真的希望至少有1个字符,不能是引号,后跟jpg扩展名:

href="((.*/)(.*?)(.jpg))"

记住正则表达式是贪婪的。您的第二次捕获
(.*)
表示匹配除新行以外的任何字符(除非处于多行模式)。因此,它可能正在捕获线路的其余部分

您可以按照Wrikken的建议将其取消冻结。但我喜欢确保我能捕捉到我想要的东西。在您的例子中,它看起来像
href
属性的值。所以我真的希望至少有1个字符,不能是引号,后跟jpg扩展名:

href="((.*/)(.*?)(.jpg))"

下面是基本的正则表达式:


下面是基本的正则表达式:


不要用正则表达式解析HTML


不要用正则表达式解析HTML


不要用正则表达式解析HTML。

不要用正则表达式解析HTML


不要用正则表达式解析HTML


不要用正则表达式解析HTML。

你能再次发布1.txt的内容吗?我用该确切文件和正则表达式得到第一个结果。你能再次发布1.txt的内容吗?我用该确切文件和正则表达式得到第一个结果。不要用正则表达式解析HTML。不要混淆对某个文件的仲裁文本文件的搜索解析HTML文件的路径。第一,我无法使用DOM选择所需的attr,第二,我接收的HTML超过了cURL。不要使用regex解析HTML。不要将搜索仲裁文本文件的特定文件路径与解析HTML文件混淆。第一,我无法使用DOM选择所需的attr,第二,我接收的HTML超过cURL。我知道这一点。我一直想把它弄得不干净,但还是没用。不知道为什么。还有,您的模式调用了php的致命错误。对不起,请转义单引号。我知道。我一直想把它弄得不干净,但还是没用。不知道为什么。还有,您的模式调用php的致命错误。对不起,请转义单引号。您能解释一下“*”后面的“?”吗。谢谢。@Ax:这会让它变得不灵活:)。它告诉*在下列模式(\.jpg)的第一次出现时停止匹配,而不是在最后一次出现时停止匹配(默认->贪婪)。标准行为表明,即使遇到以下模式,它也会一直运行,直到找到最后一个事件。这个操作员改变了这个行为。你能解释一下“*”后面的“?”吗。谢谢。@Ax:这会让它变得不灵活:)。它告诉*在下列模式(\.jpg)的第一次出现时停止匹配,而不是在最后一次出现时停止匹配(默认->贪婪)。标准行为表明,即使遇到以下模式,它也会一直运行,直到找到最后一个事件。这个运算符更改此行为。
href="((.*/)(.*?)(.jpg))"