如果/然后在正则表达式

时间:2018-03-12 13:10:46

标签: php regex

条件: 如果该行的开头有一个数字,请从该行的末尾获得一个字母。

模式方案:

(?(IF)THEN)

实施:http://sandbox.onlinephpfunctions.com/code/b2ea5d6112e546de704528add3c6f3f5f20a0af4

$a = '645 sdfjh';
preg_match("/(?(^[0-9])[a-z]$)/", $a, $var);
var_dump($var);

错误: 编译失败:断言后预期(?(在...中的偏移3处

5 个答案:

答案 0 :(得分:1)

PHP PCRE一直在支持条件子模式的早期实现。构建它的方法的主要问题是condition [PCRE.ORG]

  

有四种情况:对子模式的引用,   引用递归,一个叫做DEFINE的伪条件,和   断言。

因此将其更改为正向前瞻断言并插入.*以移动到输入字符串的末尾将使其工作:

^(?(?=\d).*\K[a-z]$)

PHP demo

答案 1 :(得分:0)

似乎IF必须是零宽度断言

(?(?=[0-9]).*([a-z]$))

link updated

答案 2 :(得分:0)

<?php
  $a = '645 sdfjh';
  if (preg_match("/^\d.*([a-z])$/", $a, $var)) {
    var_dump($var[1]);   # => "h"
  }

  $a = 'x645 sdfjh';
  if (preg_match("/^\d.*([a-z])$/", $a, $var)) {
    var_dump($var[1]);   # => won't be executed
  }
?>

答案 3 :(得分:0)

你可以试试这个:

<?php
$a = '645 sdfjh';

if(preg_match("/^[0-9]/", $a)){

var_dump(substr($a, -1));    

}

希望这对你有所帮助。

答案 4 :(得分:0)

请尝试以下代码:

你的模式有问题。

见下面的代码。这对你有帮助。

这样可以正常工作。

$a = '645 sdfjh';
preg_match('/[^a-z_\-0-9]/i', $a, $var);
if($var == true)
{
    echo substr($a, -1);
}else
{
    echo 'not matched';
}