Php 使正则表达式上的第一个关键字首先出现在结果上

Php 使正则表达式上的第一个关键字首先出现在结果上,php,regex,Php,Regex,我有这根绳子 MY NAME IS SALADIN ENDLINE YOUR NAME IS JOANNE ENDWORD 使用这个正则表达式 /(YOUR|MY)(.*)(ENDLINE|ENDWORD)/isU 将匹配 [0] = array( 0 => MY NAME IS SALADIN ENDLINE 1 => MY 2 => NAME IS SALADIN 3 => ENDLINE ) [1] = array( 0 =>

我有这根绳子

MY NAME IS SALADIN ENDLINE
YOUR NAME IS JOANNE ENDWORD
使用这个正则表达式

/(YOUR|MY)(.*)(ENDLINE|ENDWORD)/isU
将匹配

[0] = array(
  0 =>  MY NAME IS SALADIN ENDLINE
  1 =>  MY
  2 =>   NAME IS SALADIN 
  3 =>  ENDLINE
)
[1] = array(
  0 =>  YOUR NAME IS JOANNE ENDWORD
  1 =>  YOUR
  2 =>   NAME IS JOANNE 
  3 =>  ENDWORD
)
那么如何使NAME IS JOANE的结果出现在第一个匹配项(数组0)上

我试图将“YOUR”作为(“YOUR | MY)”中的第一个关键字,但仍然无法将结果弹出到数组0


提前感谢

当您使用
preg\u match\u all()
时,结果按字符串中匹配项的顺序排列,而不是按正则表达式中的顺序排列

如果您首先需要一个特定的匹配,您需要使用不同的正则表达式进行两个单独的调用。首先搜索
/(您的)(.*)(结束(?:LINEWORD))/
,然后搜索
/(我的)(.*)(结束(?:LINEWORD))/


或者,您可以简单地使用
usort()
对结果数组进行排序,以便
YOUR
的元素位于
MY
的元素之前。当您使用
preg\u match\u all()
时,结果是按字符串中找到匹配项的顺序排列的,而不是按正则表达式中的顺序排列的

如果您希望首先进行特定的匹配,则需要使用不同的正则表达式进行两个单独的调用。首先搜索
/(您的)(.*)(结束(?:LINEWORD))/
,然后搜索
/(我的)(.*)(结束(?:LINEWORD))/


或者,您可以简单地使用
usort()
对结果数组进行排序,这样
YOUR
的元素比
MY

的元素领先。使用PHP,您可以使用PREG\u match\u all()中的标志(PREG\u PATTERN\u ORDER和PREG\u SET\u ORDER)对结果数组进行排序。因为前者是默认的,所以您似乎使用了不同的编程语言,或者您使用了后者

preg_match_all($pattern,$subject,$matches,preg_pattern_ORDER):


使用PHP,您可以使用PREG_match_all()中的标志(PREG_PATTERN_ORDER和PREG_SET_ORDER)对结果数组进行排序。因为前者是默认的,所以您似乎使用了不同的编程语言,或者您使用了后者

preg_match_all($pattern,$subject,$matches,preg_pattern_ORDER):


结果总是按照它们在字符串中出现的顺序,正则表达式中的任何内容都不会改变这一点。@WiktorStribiżew我想他希望
您的
始终是第一位的,而不管原始字符串中的顺序如何<如果输入字符串的顺序不同,则code>array_reverse()将做错误的事情。结果总是按照它们在字符串中出现的顺序,正则表达式中的任何内容都不会改变这一点。@WiktorStribiżew我想他希望
YOUR
始终是第一位的,而不管原始字符串中的顺序如何<如果输入字符串的顺序不同,code>array\u reverse()将做错误的事情。我不想对任何结果进行排序(设置太多),我希望regex系统能够自行排序。。无论如何,谢谢你,这将使regexp匹配引擎变得非常复杂。目前它相对简单,遍历字符串,测试是否有匹配从当前位置开始,如果有,将其添加到结果集中。将regexp分解为不同的模式,并搜索其中的每一个模式,这将非常复杂,尤其是当存在多个可选组时(您必须尝试每个组合)。这也意味着
[abcde][abcde]
必须扩展到25个组合。我不想对任何结果进行排序(设置太多),我希望正则表达式系统能够自行排序。。无论如何,谢谢你,这将使regexp匹配引擎变得非常复杂。目前它相对简单,遍历字符串,测试是否有匹配从当前位置开始,如果有,将其添加到结果集中。将regexp分解为不同的模式,并搜索其中的每一个模式,这将非常复杂,尤其是当存在多个可选组时(您必须尝试每个组合)。这也意味着
[abcde][abcde]
必须扩展到25种组合。
[0] = array(
  0 =>  MY NAME IS SALADIN ENDLINE
  1 =>  YOUR NAME IS JOANNE ENDWORD
)
[1] =>  array(
  0 =>  MY
  1 =>  YOUR
)
[2] =>  array(
  0 =>   NAME IS SALADIN 
  1 =>   NAME IS JOANNE 
)
[3] =>  array(
  0 =>  ENDLINE
  1 =>  ENDWORD
)