是否有正则表达式符号匹配一个,另一个或两者(如果可能)?

时间:2013-07-15 17:45:18

标签: php regex

我想突出显示一组单词,它们可以单独出现或连续出现。如果它们一个接一个地出现,我希望它们一起突出显示,如果它们不一样,它们也应该突出显示,就像正常行为一样。例如,如果我想突出显示单词:

  

结果为

主题是:

  

实时结果:在您键入时显示结果

我希望结果如下:

  

实时结果:显示< span class =“highlight”>结果为< / span>你输入

空白也很令人头疼,因为我尝试使用或表达式:

( results )|( as )

用空格来防止突出显示低音,崩溃等字样。但由于结果之后的空格与之前的空格相同,因此正则表达式会忽略它并仅突出显示结果。

它可用于突出显示许多单词以及

的组合
( (one) (two) )|( (two) (one) )|( one )|( two )

不是一个选项:(

然后我认为可能有一个像|一样工作的运算符如果可能的话,可以用来匹配两者,否则一个或另一个。

2 个答案:

答案 0 :(得分:5)

使用空格来确保匹配完整的单词是错误的方法。这就是单词边界的含义:\b匹配单词和非单词字符之间的位置(其中单词字符通常是字母,数字和下划线)。要匹配所需单词的组合,您可以简单地将它们全部放在一起(就像您已经做过的那样),并尽可能多地重复。像这样:

(?:\bresults\b\s*|\bas\b\s*)+

这假设您要在示例中突出显示第一个和单独的results(这将满足您对问题的描述)。

答案 1 :(得分:3)

也许你不需要匹配彼此相邻的一串字。为什么不像这样应用你的突出显示:

  

实时结果:显示< span class =“突出显示”>结果< / span> < span class =“highlight”> as< / span>你输入

唯一不同的是,单词之间的空间没有突出显示,但这是一个干净而简单的妥协,这将节省你的工作时间,并且似乎不会伤害用户体验(至少在我看来)。

在这种情况下,您可以使用替换:

\b(results|as)\b

\bword boundary anchor

如果你真的不喜欢没有突出显示的单词之间的空格,你可以编写一个jQuery函数来查找仅由空格分隔的“突出显示”跨度然后将它们组合起来(“第二阶段”以实现你的用户体验设计目标)。

<强>更新
(好吧......所以合并跨度实际上很难通过jQuery。请参阅Find text between two tags/nodes