【问题标题】:php - Regex - space and non-capturing groupphp - 正则表达式 - 空间和非捕获组
【发布时间】:2015-06-21 18:49:33
【问题描述】:

我有这种字符串:

Blabla1 Blaabla2<br />  Blaabla3 Blaabla4

我正在尝试用 preg_split 爆炸每个有 " ""&lt;br /&gt;" 的单词。

我的期望:

Blabla1
Blabla2 <br />
Blaabla3
Blaabla4

我尝试了这个正则表达式(?:(&lt;br\s))|\s,但没有设法排除"/&gt;"

http://regexr.com/3aqs0

谢谢!

【问题讨论】:

  • 您要保留&lt;br /&gt; 吗?您的预期输出显示它保留了...
  • 文本中是否有其他 HTML 标签?
  • @hwnd 是的,我想要它 :)
  • @JasonMcCreary 是的,喜欢 ...
  • 如果您将所有&lt;br/&gt; 转换为空格,然后对空格进行拆分,可能会更清楚。您无需在一个正则表达式中完成所有操作。

标签: php regex


【解决方案1】:

您可以这样做的一种方法:

$str = 'Blabla1 Blaabla2<br />  Blaabla3 Blaabla4';
$results = preg_split('~(?:<br[^>]*>\s*\K|\s+)~', $str);
print_r($results);

输出

Array
(
    [0] => Blabla1
    [1] => Blaabla2<br />  
    [2] => Blaabla3
    [3] => Blaabla4
)

【讨论】:

  • 效果很好,谢谢!但是你能解释一下吗,请为我提供信息:)。我很感兴趣!
  • 你只是想在空白处分割而不是在 HTML 中吗?请注意,如果&lt;br&gt; 前面也有空格,这将拆分它。我不清楚你到底想在这里实现什么。
  • 其实我用的是文本编辑器(CKEDITOR)。当我将文本区域保存在数据库中时,我需要保留所有标签(
    )。然后,当我用我的文本编辑器重新加载页面时,我需要用他的相关标签拆分每个单词,因为我的文本编辑器与一个音频播放器 (Jwplayer) 相结合,它会根据时间提前在每个单词下划线...
  • 其他问题,如果我的字符串中有两个或多个连续的
    ?喜欢$str = 'Blabla1 Blaabla2&lt;br /&gt;&lt;br /&gt; Blaabla3 Blaabla4';怎么办?
  • 你可以做(?:(?:&lt;br[^&gt;]*&gt;\s*)+\K|\s+)
【解决方案2】:

如果没有更多的 HTML,可以使用 RegEx。 Otherwisethereare many better ways.

使用&lt;br(\s\/)?&gt;\K|\s

$matches = preg_split('/<br(\s\/)?>\K|\s/',$string);

这也适用于&lt;br&gt;(这也是正确的 HTML)

考虑标志PREG_SPLIT_NO_EMPTY,因为使用您的示例字符串会有空元素:

preg_split('/<br(\s\/)?>\K|\s/',$string,null,PREG_SPLIT_NO_EMPTY);

更新:要保留&lt;br /&gt;,您需要使用\K 重置匹配。 the language reference 中有一个很好的例子:

\K 自 PHP 5.2.4 起可用于重置匹配开始。例如, 模式 foo\Kbar 匹配“foobar”,但报告它已匹配 “酒吧”。 \K 的使用不会干扰捕获的设置 子串。例如,当模式 (foo)\Kbar 匹配“foobar”时, 第一个子字符串仍然设置为“foo”。

【讨论】:

  • 他还可以使用 PREG_SPLIT_NO_EMPTY 来避免空元素,例如 preg_split('/(?:(
    ))|\s/',$string,null,PREG_SPLIT_NO_EMPTY);
  • 正确,忘记了标志:) 我会添加这个
  • 几乎完美:) ... blabla2 之后如何保留
  • @Marc 干得好! :) 现在,如果在我的字符串中有两个或多个连续的
    ?喜欢$str = 'Blabla1 Blaabla2&lt;br /&gt;&lt;br /&gt; Blaabla3 Blaabla4';怎么办?
  • 在这里找到解决方案:stackoverflow.com/questions/29671967/…。谢谢大家!
猜你喜欢
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多