Php 将非单词与字符串上的最后一个单词匹配

Php 将非单词与字符串上的最后一个单词匹配,php,html,regex,string,Php,Html,Regex,String,我需要匹配最后一个非单词和字符串上的最后一个单词(两个选项)。通过将原始字符串替换为null,将从原始字符串中删除匹配项。我目前的结果是: 正则表达式: \W* # Matches optional lasts non-words. \w* # Matches optional last word. $ 工作案例: \W* # Matches optional lasts non-words. \w* # Matches optional last word. $ 当然,我有个问题

我需要匹配最后一个非单词和字符串上的最后一个单词(两个选项)。通过将原始字符串替换为null,将从原始字符串中删除匹配项。我目前的结果是:

正则表达式:

\W*  # Matches optional lasts non-words.
\w*  # Matches optional last word.
$
工作案例:

\W*  # Matches optional lasts non-words.
\w*  # Matches optional last word.
$

当然,我有个问题。我想接受HTML实体作为单词的一部分,但由于它有非单词字符(结尾分号),所以最后的分号被错误地匹配和替换

目前我只希望它匹配简单的HTML实体,基本上它是
&\w+(如
&aaccute;
),稍后我将对其进行改进(现在,让我们使用它来简化答案)

我的期望:

\W*  # Matches optional lasts non-words.
\w*  # Matches optional last word.
$


我想,我只需要在某个地方添加HTML实体表达式,以避免在第一个表达式(
\W*
)上匹配它。但是我尝试了一些方法,但没有成功。

您不能使用
\w
,因为它不包括您指出的HTML实体

相反,接受字母和HTML实体的任意组合,如下所示:

([a-zA-Z]*(&[a-zA-Z]+;)*[a-zA-Z]*)+\s([a-zA-Z]*(&[a-zA-Z]+;)*[a-zA-Z]*)+$

我不知道有什么方法可以实现您特别提到的正则表达式匹配目标。我相信您需要一个可变宽度的负回望,以避免匹配不需要的HTML实体,而这在我所看到的任何实现中都不存在

但是,如果您的真正目标只是以指定的方式拆分字符串,那么有两种方法可以实现该目标

#1
您可以将初始字符作为一个组进行匹配和使用,将原始字符串替换为第一个组匹配(
${result}
${removed}
将使文本与问题中描述的已删除字符匹配


由于所有匹配项都是可选的,因此尾随的
(?这可能是一项简单的任务,但主要问题是定义(并在问题中解释)一个词的确切名称(字符和序列的详尽列表)。另一个问题,你使用什么语言?基本上,我称word为表达式
\w*
,而非word为表达式
\w*
。我正在处理PHP/PCRE。非常感谢!如果你使用PHP,为什么不在用正则表达式处理字符串之前转换HTML实体?因为HTML实体是可选的,它应该理解用户希望保留定义的HTML实体,而不解码。用户想要什么并不重要,唯一的问题是最终的最佳格式是什么(供最终使用):有或没有HTML实体?请注意,您可以编码()和解码()。也请注意,这样做比在模式中描述一些看起来像html实体但最终没有意义的东西要好,比如:
&happyNewYear;
它通过了我在“单元测试”选项卡上定义的所有测试。但是感谢您的帮助。我不明白您想要什么。请在所以我们可以运行它们。我只是想现在正则表达式不应该单独解决这个问题(在一个表达式中)。然后我改变了我的引擎,用表达式一个接一个地使用单词。它现在工作了。非常感谢!