正则表达式 - 选择&#34; <! - ?“但不是”<?php“

时间:2016-05-18 08:29:20

标签: php regex

我试图使用正则表达式来选择像<?这样的实例(使用php构造而不是<?php。我已经在{{{I}上尝试了几次迭代3}}但失败了。这是最新的<\?(?!<\?php)

基本上这就是我想要的。它涵盖了我的文档中的所有变体

<?php foo ?> //should not match
<? bar ?> //should match '<?'
<?=foobar ?> //should match '<?='
<?xml barbar ?> //should not match

我是正则表达式的新手,所以任何帮助都会受到赞赏

修改:发布了回答的问题我还要再添加一个条件

<?php foo ?> //should not match
<? bar ?> //should match '<?'
<?bar ?> //should match '<?' there could be any character after ?
<?=foobar ?> //should match '<?='
<?xml barbar ?> //should not match

总结一下,我只是尝试匹配<?<?=而不是它们出现的完整行。

编辑2 :基本上,表达式的逻辑应该是:匹配<?<?=,但如果后面跟着`php&#39;或者&#39; xml&#39;

4 个答案:

答案 0 :(得分:1)

您可以使用否定先行断言:

<\?=?(?!php|xml)
如果(?!php|xml) ir php之后有xml<?文字,

,?=将无法匹配,从而失败<?php和{{ 1}}。

RegEx Demo

答案 1 :(得分:1)

您可以使用

<\?[^\w\s]+|<\?\B

请参阅regex demo

模式详情

  • <\?[^\w\s]+ - 一个文字<?序列,后跟一个字和一个空格以外的1个字符
  • | - 或
  • <\?\B - <?文字字符序列后跟非字边界(意味着?后面应该有一个非字字符。)

答案 2 :(得分:0)

使用以下正则表达式: -

(<\?(?=\s).*)|(<\?=.*)

它将匹配两个记录

<? bar ?> 
<?=foobar ?> 

如果你只写

(<\?(?=\s))|(<\?=)

它仅匹配<?<?=

答案 3 :(得分:0)

我终于找到了它。

<\?=?(?!php)(?!xml)

这会将<?与可选的=匹配,而不会跟随字符串&#39; php&#39;和&#39; xml&#39;