这是PHP代码。我有一个字符串$heads。此字符串返回带有链接属性的列表项:
<li><a href="#link-to-h2-heading" id="some-id">Example title</a></li>现在,我想去掉这个字符串中的id,所以我开始使用str_replace来去除id=的“some”,但是我没能让它正常工作。id="“是动态的,因此它可以是任何单词或组合。
有人能帮忙吗?
谢谢!
发布于 2020-11-19 11:22:34
正如Mitya提议的那样,使用正则表达式来做到这一点:
正则表达式(不完全正确):\s*id="[^"]+"
解释:
\s意味着搜索空白,character.\s*意味着该空格可能丢失或多个。因此,两个或更多的空格将是matched.[],用于匹配必须在两者之间指定的字符列表。但是,如果以^开头,那么除了给定的列表之外,所有字符都是字符。所以[^"]指的是任何不是"字符的字符。+运算符有点像*运算符。意思是“多次但至少一次”。因此,我在这里匹配id值。下面是您可以测试的解决方案:https://regex101.com/r/WlypLb/1
我激活了i regex选项,使其不区分大小写。m选项用于多行,这意味着当您使用^ (开始)或$ (以结束)等正则表达式运算符时,将对输入的每一行进行搜索。如果你想用一个值列表来测试你的输入,这是非常有用的。但在这里,对你的案子,它没有任何影响。
您可以直接从Regex101生成PHP代码:
$regex = '/\s*id="[^"]+"/i';
$str = '<li><a href="#link-to-h2-heading" id="some-id">Example title</a></li>';
$subst = '';
$result = preg_replace($regex, $subst, $str);
echo $result;但是现在,如果您的HTML包含<li id="some-id-a"><a href="..." id="some-id-b">...</a></li>,那么两个if都将被删除。在这种情况下,您必须创建一个更好的正则表达式,只捕获<a>标记。您可以这样做:首先将锚与一个正则表达式匹配,然后用第二个正则表达式删除其中的id。
还请注意,id值也可以如下所示:
<a href="..." id=some-id>...</a><a href='...' id='some-id'>...</a><a href = "..." id = "some-id">...</a>,因为=标志周围允许空格。是的,这很愚蠢..。但这是有可能的。如果需要,您可以更改regex,但我希望您的HTML总是对属性值使用双引号,就像通常应该的那样。
我们也应该小心,因为您可能有一个属性名,最后使用id。一个实际的示例,其中可以注入一些数据属性,例如用于网站管理的数据属性,其中一些JavaScript读取这些属性:
<li id="menu-contact">
<a href="/contact" id="menu-link-contact" data-edit-id="link34234">Contact</a>
</li>如果您按原样使用我们的简单正则表达式,我们将不幸地破坏HTML。您可以在这里看到它的作用:https://regex101.com/r/WlypLb/2
为了解决这个问题,我们知道属性应该是一个完整的单词。我们可以使用\b regex操作符来匹配“单词开始”或“单词结束”,从而导致\bid=而不是id=。或者我们可以假设之前的空间应该一直存在,所以\s* 应该被 \s+**,替换,从而得到更正确的regex**:\s+id="[^"]+"
因此,正如您所看到的,在属性的等号周围允许空格,并且使用可能的单引号或没有它们,正则表达式开始变得相当复杂:\s+id\s*=\s*(["']|\b)[\w\d\-_]+\1
您可以在这里测试它:https://regex101.com/r/WlypLb/3
在这种情况下,大多数人推荐使用XML解析器,比如PHP提供的解析器:https://www.php.net/manual/refs.xml.php。
但是,很明显,对于简单的情况,像\s+id="[^"]+"这样的正则表达式将起作用,并将比XML解析器运行得快得多。很高兴知道,当输入HTML可能因为更新或其他原因而发生更改时,防弹正则表达式或XML解析器是最好的。
发布于 2020-11-19 11:07:04
你能试试preg_replace和一些regex吗?
$string = preg_replace('#id="[^"]*"#', '', $string);查找表单id="的所有短语,然后带任何非",然后转到"并替换为''(empty)
发布于 2020-11-19 11:35:23
这是您所需的解决方案,使用regex:
$string = 'li><a href="#link-to-h2-heading" id="some-id">Hello there</a></li>"';
$reg = '/id="[^"]+"/i';
$newString = preg_replace($reg, '', $string);https://stackoverflow.com/questions/64910188
复制相似问题