我试图创建一个Perl正则表达式,它匹配一个URL,该URL前面没有等号和一个单引号或双引号(可选),忽略空格. 下面的代码给出了一个错误:Warning: preg_replace(): Compilation failed: lookbehind assertion is not fixed length at offset 0

我知道我的URL正则表达式并不完美,但我更关注的是如何做负向后看,或者如何用其他方式表达.

例如,在下面的代码中,在匹配中,它应该输出http://www.url1.com/http://www.url3.com/,而不是其他URL. 我该怎么办? 下面的代码给出了一个警告,并且不填充$matches变量.

PHP代码:

$html = "
http://www.url1.com/
= ' http://www.url2.com/
'http://www.url3.com/
<a href='http://www.url4.com/'>Testing1</a>
<img src='https://url5.com'>Testing2</a>";

$url_pregex = '((http(s)?://)[-a-zA-Z()0-9@:%_+.~#?&;//=]+)';
$pregex = '(?<!\\s*=\\s*[\'"]?\\s*)'.$url_pregex;

preg_match_all('`'.$pregex.'`i', $html, $matches);

echo "Matches<br><pre>";
var_export($matches);
echo "</pre>";

Perl Regex在PHP中使用`而不是/:

'`(?<!\\s*=\\s*[\'"]?\\s*)((http(s)?://)[-a-zA-Z()0-9@:%_+.~#?&;//=]+)`i'

推荐答案

解决这个问题的一种方法是使用交替,第一部分匹配are前面加=的URL(和一个可选的引号),第二部分只匹配随后捕获的URL.这是因为交替的第一部分总是先测试,所以只有前面没有=的URL才会被交替的第二部分捕获.

为了简单起见,我已经从$url_pregex中删除了捕获组;如果您希望它们加入,则需要调整代码中$matches上的组号以获得完全匹配.

$html = "
http://www.url1.com/
= ' http://www.url2.com/
'http://www.url3.com/
<a href='http://www.url4.com/'>Testing1</a>
<img src = 'https://url5.com'>Testing2</a>";

$url_pregex = 'https?://[-a-zA-Z()0-9@:%_+.~#?&;//=]+';
$pregex = "\\s*=\\s*['\"]?\\s*$url_pregex|($url_pregex)";

preg_match_all('`' . $pregex . '`i', $html, $matches);

echo "Matches<br><pre>";
var_export(array_values(array_filter($matches[1])));
echo "</pre>";

输出:

Matches<br><pre>array (
  0 => 'http://www.url1.com/',
  1 => 'http://www.url3.com/',
)</pre>

演示3v4l.org

请注意,您需要使用preg_match_all来获取文本中的所有匹配项.

Php相关问答推荐

在WooCommerce中执行一次银行电汇确认付款代码

获得客户S在WooCommerce为期1年的总支出

根据用户组或登录状态显示或隐藏定价后添加的文本

如何使用php-amqplib连接到ActiveMQ Classic Docker镜像

如何减少Laravel分页中的链接数

在没有symfony应用程序的情况下使用安全Bundle 包时,缺少配置构建器类

从订单项目中获取ACF WooCommerce产品价值

将一个按钮添加到WooCommerce产品的管理视图中,该按钮链接到一个自定义的WebHook,并在末尾附加产品ID

哪里的表现能更好?

如何从phpseclib和SFTP获取日志(log)记录?

在WooCommerce中以编程方式添加特定产品后,将价格设置为零

防止 WooCommerce 在前端加载全尺寸图像

Symfony:从控制器内部调用自定义命令

在 DateTime 或 DateTimeImmutable 对象上调用modify() 时是否必须使用空格?

使用 PHP 的 OAuth 2.0 MAC

Shopware 6 AuthControllerDecorator已弃用

Laravel使用另一张表进行关联查询

为什么在 phpunit 的开头测试 PHP_VERSION?

即使密码匹配,密码处理程序也会返回错误

Laravel - 关联与设置观察者事件的 ID