【问题标题】:PHP Regex Skip First MatchPHP 正则表达式跳过第一个匹配
【发布时间】:2013-11-10 10:11:54
【问题描述】:

我有以下数据:

<h5> MY DATA </h5>
» Test data1
» Test data2
» Test data3

我希望匹配除第一个之外的所有“»”。但是我尝试过的各种正则表达式都不起作用。请提出一些解决方案。

谢谢

【问题讨论】:

  • 您好 Pendo,感谢您的回复。但这是一种解决方法 - 因为它首先找到第一个匹配项和位置,然后删除所有内容,然后将第一个位置的任何内容放回原处。我想知道单个正则表达式中是否有可以解决问题的东西。 regexr.com?374h8
  • 还有另一个完全是正则表达式的答案(页面上的第二篇文章)
  • But the various regex that i've tried do not work 然后向我们展示您尝试过的内容以及失败的原因。另外请准确地说,如果在» Test data1» Test data2 之间有另一个随机行,如foobar。会匹配还是不匹配?
  • 嗨 HamZa,谢谢回复。不,该行将不匹配。只有符号。先跳过。我试过 (?:^»)(.*)(»), ?!^.?)(»), ...等

标签: php regex


【解决方案1】:

但是为什么你想匹配除第一个之外的每个»?如果您告诉我们您想要完成的工作,而不是您尝试完成的方式,您会得到更好的回复。

据我了解,您有两行或多行以某个字符开头的块,并且您想在除最后一行之外的每一行的末尾添加一个&lt;br/&gt; 标记。当你这样描述它时,正则表达式实际上是自己写的:

^        # beginning of line (in multiline mode)
(».+\R)  # `»` and the rest of the line, including the trailing newline (`\R`)
(?=»)    # lookahead checks that the next line begins with `»`, too

该行在第 1 组中被捕获,因此我们将其重新插入替换字符串并添加 &lt;br/&gt; 标签:

$result = preg_replace('/^(».+\R)(?=»)/m', '$1<br/>', $subject);

我不精通 PHP,但您可能需要添加 UTF8 修饰符 (/^(».+\R)(?=»)/mu) 或为 » 字符 (/^(\x{BB}.+\R)(?=\x{BB})/m) 使用十六进制转义符。

【讨论】:

  • 不错的正则表达式,但有一点误解。他想匹配每个»,除了第一个而不是最后一个 :)
  • 天啊!我第一句话中的“最后”一词应该是“第一”。但推理仍然适用。他试图将» 添加到除第一行之外的所有行的开头,这与将其添加到除last 行之外的所有行的end 相同。而且,如果您从这些方面考虑问题,就会更容易找到解决方案,至少我相信。
【解决方案2】:

你可以试试这个:

$result = preg_replace('~[^>\s]\h*\R\K(?=»)~', '<br/>', $string);

详情:

[^>\s]  # a character that is not a white char or a > (to avoid the first line)
\h*     # horizontal white chars zero or more times (possible leading spaces)
\R      # a new line
\K      # remove all that have been matched before
(?=»)   # lookahead assertion, to check if there is a » after

该模式的目标是在字符串中的好位置匹配一个空字符串。

【讨论】:

  • 谢谢大家..尝试了一些解决方案,包括这个..但无法让它工作......最后找到了解决与符号无关的中断问题的解决方法,但确定了换行符:/(^[\rn]*|[\r\n]+)[\s\t]*[\r\n]+/
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多