【问题标题】:preg_replace() with multiple linespreg_replace() 多行
【发布时间】:2019-08-03 04:57:49
【问题描述】:

我又遇到了 preg_replace() 的问题。我非常需要一本关于 preg_replace() 的书。

我的意图是将 <td> author </td> 替换为 <td> Level1 </td>

有什么想法吗? <td> author </td> 被其他 HTML 元素包裹:

<td align="center">
  <a onclick="return listItemTask('cb1','block')" href="javascript:void(0);">
    <img width="16" height="16" border="0" alt="Blocked" src="images/tick.png">
  </a>
</td>
<td>
  Author
</td>

【问题讨论】:

  • 你又遇到麻烦我一点也不奇怪。使用正则表达式解析 HTML 是自找麻烦
  • 每次在同一个句子中提到“regex”和“HTML”时,都会有人对此表示反对。问题是,您需要了解解析 HTML 和搜索恰好是 HTML 的文本之间的区别。 IMO,这是对正则表达式的有效使用;这个问题所需的功能可以通过文本编辑器中任何基于正则表达式的搜索和替换轻松实现。
  • @Ryan Kinal:通常我会同意你的观点,但在这种情况下,如果不需要解析,简单的字符串替换就足够了。如果需要解析,那么正则表达式将无法处理所有情况。
  • @mehaase 是的。那时你必须依赖解析器。如果没有嵌套标签,并且标签没有属性(甚至是特定的、已知的、具有近乎精确空格的相同顺序属性),您可以(很可能)使用正则表达式(或者甚至是简单的字符串替换,如果模式很简单)。用一个概括但复杂的案例来反驳一个具体的简单案例不是一个有效的论点。我在这里指的是原始问题中的特定情况,而不是用另一个标签及其内容替换一个标签及其内容的普遍问题。
  • @mehasse 说真的。告诉我myHTMLString.replace(/&lt;td&gt;\s*author\s*&lt;\/td&gt;/g, '&lt;td&gt;level1&lt;/td&gt;'); 无效。我敢你。

标签: php regex preg-replace


【解决方案1】:

来自Perl regular expression manual page:(或PHP PCRE docs

修饰符

匹配操作可以有多种 修饰符。相关的修饰符 常规的解释 下面列出了里面的表达式。

  • s:将字符串视为单行。即改“.”。匹配任何字符 无论如何,即使是换行符, 通常它不会匹配。

【讨论】:

  • 既然是PHP,为什么不引用the PHP doc
  • @KennyTM:因为我搜索了preg_replace 并且那里没有描述语法。 AFAIK,PCRE 应该与 Perl 的正则表达式完全兼容。我会在我的答案中加入链接。
【解决方案2】:

一点代码永远不会伤害...

<?php
$string = '
<td align="center">
  <a onclick="return listItemTask(\'cb1\',\'block\')" href="javascript:void(0);">
    <img width="16" height="16" border="0" alt="Blocked" src="images/tick.png">
  </a>
</td>
<td>
  Author
</td>';

$string = preg_replace("/<td>.*Author.*<\/td>/s", "teste", $string);

echo $string;

?>

请注意 \s modifier 用于允许 . 匹配 newlines

【讨论】:

  • @tweakmy 我真的无法通过您的评论判断这是您要找的还是 you'r just playing 但是,如果这是您要找的,您应该点击“问题旁边的 V'(接受)。这将使我们俩都为此感到自豪!欢迎使用 StackOverflow (SO)!
  • 确实没有。认真回答应该是必需的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多