【问题标题】:PHP Preg-replace - Identify only dashes, spaces and breaksPHP Preg-replace - 仅识别破折号、空格和中断
【发布时间】:2021-05-05 10:20:39
【问题描述】:

早上好,我有一个字符串,其中有表示为<p>----</p> 的中断。破折号的数量通常不同。有时有 4 个,有时有 5 个,等等。

类似这样的:

Lorem ipsum 
<p>------</p>
Lorem Ipsum 
<p>----------------</p>
Lorem Ipsum 
<p>--------------</p>

我想写一个 php preg_replace 命令来使它们都统一和相同。

这是我开发的,但它不起作用。哪里出错了?

$search = "/(<p>-)(.*?)(-<\/p>)/";
$replace = "<p>-------------</p>";
$item = preg_replace($search,$replace,$item); 

此外,还有比 (.*?) 更精确的方法来仅匹配空格和破折号。

编辑 1: 感谢回答部分的团队,我更正了这样的功能:

$search = "/(<p>-)[\h-]+(<\/p>)/";
$replace = "<p>-------------</p>";
$item = preg_replace($search,$replace,$item); 

只要文本在最后一个破折号和&lt;/p&gt; 之间没有中断,就可以正常工作。如何识别虚线、空格并捕获\n

示例: &lt;p&gt;----- \n&lt;/p&gt;

【问题讨论】:

  • 您只能将空格和破折号与[\h-]+匹配
  • 注意:当你写一个问题时,确保你发布一个符合描述的例子。你说你的代码不起作用,但它在问题的例子中工作得很好:3v4l.org/6mLIA

标签: php preg-replace


【解决方案1】:

您实际上并不需要 3 个捕获组。您可以使用[\h-]* 匹配零个或多个水平空白字符并将其替换为&lt;p&gt;-------------&lt;/p&gt; 的固定替换

例如,在您的代码中,开头和结尾总是有一个-

$item = <<<DATA
Lorem ipsum 
<p>------</p>
Lorem Ipsum 
<p>----------------</p>
Lorem Ipsum 
<p>---------   -----</p>
DATA;

$search = "~<p>-[\h-]*-</p>~";
$replace = "<p>-------------</p>";
$item = preg_replace($search, $replace, $item);

echo $item;

输出

Lorem ipsum 
<p>-------------</p>
Lorem Ipsum 
<p>-------------</p>
Lorem Ipsum 
<p>-------------</p>

【讨论】:

  • 你的问题让我觉得\n 有点不清楚。这是您试图解释换行符的方式,还是实际上在该行中有一个斜线后跟一个n?如果您只是想匹配一个不可见的换行符,那么将 TheFourthBird 的模式从 \h 更改为 \s 即可。
  • @Andreito 如果你也想匹配换行符,你可以使用\s like $search = "~&lt;p&gt;-[\s-]*-&lt;/p&gt;~";
【解决方案2】:

您可以尝试查找模式&lt;p&gt;-{1,}&lt;/p&gt;,然后用您想要的任意数量的破折号替换,例如&lt;p&gt;-----&lt;/p&gt;:

$input = "Lorem ipsum \n<p>------</p>\nLorem Ipsum \n<p>----------------</p>\nLorem Ipsum\n<p>--------------</p>";
$output = preg_replace("/<p>\s*-{1,}\s*<\/p>/", "<p>-----</p>", $input);
echo $output;

打印出来:

Lorem ipsum 
<p>-----</p>
Lorem Ipsum 
<p>-----</p>
Lorem Ipsum
<p>-----</p>

【讨论】:

  • 谢谢,但这似乎只识别破折号(而不是破折号和空格)。所以当有一个 ''"

    -----

    " 时,preg_replace 不会捕捉到中断。我该如何纠正它?
  • @Andreito 然后尝试使用正则表达式模式&lt;p&gt;\s*-{1,}\s*&lt;\/p&gt;,它允许在&lt;p&gt; 标签内部的任一端使用可选空格。
  • 我尝试使用这个/(&lt;p&gt;-)[\h-]+(&lt;\/p&gt;)/ 并且似乎工作正常。但是,如果最后一个破折号和 之间有中断,则它不起作用。如何识别虚线、空格甚至捕获 \n ?
  • 编辑您的问题并向我们揭示实际问题。谢谢。
  • 完成。谢谢蒂姆!
猜你喜欢
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 2017-05-22
  • 2023-03-05
相关资源
最近更新 更多