2 回答
TA贡献1801条经验 获得超16个赞
您可以尝试:
(<a href=".*?)"(.*?)"(.*)
上述正则表达式的解释:
(<a href=".*?)
- 代表第一个捕获组捕获捕获第一个之前的所有内容"
。请注意,我使用了惰性匹配,这有助于完成此任务。"
-"
从字面上匹配。(.*?)
- 表示第二个捕获组捕获xyz&123
介于两者之间的数据"
。(.*)
- 代表第三个捕获组,捕获 后的所有内容"
。$1\'$2\'$3
- 对于更换零件;将捕获的组与单引号一起使用。
您可以在此处找到上述正则表达式的演示。
示例实现 inf php:
<?php
$re = '/(<a href=".*?)"(.*?)"(.*)/m';
$str = '<p style="abc" rel="blah blah"> Hello I am p </p> <a href="https://example.com/abc?name="xyz&123""></a>';
$subst = '$1\'$2\'$3';
$result = preg_replace($re, $subst, $str);
echo $result;
您可以在此处找到上述代码的示例运行。
TA贡献1909条经验 获得超7个赞
我尝试过
preg_replace('/<a\s+[^>]*href\s*=\s*"([^"]+)"[^>]*>/', '<a href="\1">', $content)
正则表达式。但这会删除锚标记中除 href 之外的所有属性。
也许更通用一些——一<a ...>
开始就将所有这些东西排除在外?
没有太多的 HTML 元素一href
开始就具有属性 - 即使您遇到具有这样的href
值的不同元素,它在那里也没有意义,因此无论如何它也需要替换。
#href="(\S+)"#
作为贪婪模式寻找并捕获href="
和之间最长的可能非空白字符串"
。这给出了href="https://example.com/abc?name="xyz&123""
完整匹配,以及https://example.com/abc?name="xyz&123"
部分匹配。
让我们将后者输入str_replace
以消除"
, 使用preg_replace
:
$content = preg_replace_callback('#href="(\S+)"#', function($m) { return 'href="'.str_replace('"', '', $m[1]).'"'; }, $content);
- 2 回答
- 0 关注
- 135 浏览
添加回答
举报