首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用str_replace消除链接属性id

问如何使用str_replace消除链接属性id
EN

Stack Overflow用户
提问于 2020-11-19 10:52:45
回答 3查看 57关注 0票数 0

这是PHP代码。我有一个字符串$heads。此字符串返回带有链接属性的列表项:

代码语言:javascript
复制
<li><a href="#link-to-h2-heading" id="some-id">Example title</a></li>

现在,我想去掉这个字符串中的id,所以我开始使用str_replace来去除id=的“some”,但是我没能让它正常工作。id="“是动态的,因此它可以是任何单词或组合。

有人能帮忙吗?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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代码:

代码语言:javascript
复制
$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读取这些属性:

代码语言: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解析器是最好的。

票数 1
EN

Stack Overflow用户

发布于 2020-11-19 11:07:04

你能试试preg_replace和一些regex吗?

代码语言:javascript
复制
$string = preg_replace('#id="[^"]*"#', '', $string);

查找表单id="的所有短语,然后带任何非",然后转到"并替换为''(empty)

票数 1
EN

Stack Overflow用户

发布于 2020-11-19 11:35:23

这是您所需的解决方案,使用regex:

代码语言:javascript
复制
$string = 'li><a href="#link-to-h2-heading" id="some-id">Hello there</a></li>"';
$reg = '/id="[^"]+"/i';
$newString = preg_replace($reg, '', $string);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64910188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档