【问题标题】:Regex PHP to find and replace white space and,or new line between HTML tags正则表达式 PHP 查找和替换空格和/或 HTML 标记之间的新行
【发布时间】:2014-12-28 11:32:59
【问题描述】:

我将有一个由 HTML 代码组成的字符串(一行),该代码将存储在 PHP 变量中。该字符串来自一个 HTML 页面,该页面通常在标签之间有换行符和空格。我们可以有新行(一个或多个)和,或像这个例子这样的空白:

<h1>tag1</h> 
       <p>Between h ad p we have \s and \n</p>

在执行正则表达式和 preg_replace 之后,我想要这个:

<h1>tag1</h><p>Between h ad p we have \s and \n</p>

我已经尝试过这个正则表达式,但它不起作用。

$str=<<<EOF
<h1>tag1</h> 
           <p>Between h ad p we have \s and \n</p>

EOF;


$string =  trim(preg_replace('/(>\s+<)|(>\n+<)/', ' ', $str)); 

在这里你可以找到完整的代码http://www.phpliveregex.com/p/7Pn

【问题讨论】:

标签: php regex preg-replace


【解决方案1】:

有两个问题

(preg_replace('/(>\s+<)|(>\n+<)/', ' ', $str)
  • \s 已包含\n,因此无需提供其他替代。

  • (&gt;\s+&lt;)here 正则表达式同时使用角度 &lt;&gt;,因此用空格替换 将删除包括角度在内的所有内容

输出是

<h1>tag1</hp>Between h ad p we have \s and \n</p>

这不是你想要的

如何纠正

使用正则表达式 (&gt;\s+&lt;) 和替换字符串作为 &gt;&lt; 将输出作为

<h1>tag1</h><p>Between h ad p we have \s and \n</p>

例如http://regex101.com/r/dI1cP2/2

您也可以使用环视来解决问题

正则表达式是

(?&lt;=&gt;)\s+(?=&lt;)

替换字符串为空字符串

说明

(?&lt;=&gt;) 断言\s 前面有&gt;

\s+ 匹配一个或多个空格

(?=&lt;) 断言\s 后跟&lt;

这里的环顾不会像之前的正则表达式那样使用任何尖括号

例如见http://regex101.com/r/dI1cP2/3

【讨论】:

  • 您好 nu11p01n73R,事实上,在正则表达式之外有一个字母“g”(修饰符)会有所不同。那么我们应该在 php 代码中这样使用 preg_replace("/(&gt;\s+&lt;)/g", "&gt;&lt;", $str); 吗?
  • @zwitterion 很高兴听到它起作用了 :) 希望你解决了问题
  • 是的,事实上,对于 php 中的 preg_replace 我们不需要使用“g”修饰符。谢谢
【解决方案2】:

你可以试试这个:

echo preg_replace("/(?=\>\s+\n|\n)+(\s+)/", "", $str);

【讨论】:

  • 如果他们使用windows服务器呢?
  • @ArtisiticPhoenix,对不起,我还没有使用 Windows Server 的经验,你能详细说明它在 Windows Server 上不工作的原因吗?
  • 很多时候windows会使用"\r\n"作为行尾。所以只是 "\n" 可能不匹配。
【解决方案3】:
(?<=<\/h>)\s+

试试这个。查看演示。替换为empty string

http://regex101.com/r/jI8lV7/1

【讨论】:

    猜你喜欢
    • 2020-08-29
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2011-06-16
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多