我希望从正则表达式中的条件或条件的结尾进行匹配。
$a = 'SI-#CL#¤1801 BARBER LANE#CL#MILPITAS CA 95035#CL#FONE 1-408-943-0600#CL#FAX 1-408-943-0484#CL#¤CANCEL BY 5 PM - RQST-NO FEATHER';
$pat = '/^(?(?=SI)(?<matchfromend>[A-Z]+$)|(?<else>.*))/';
我想匹配取消下午5点 - RQST-NO FEATHER 仅当字符串从 SI -
开始时有什么建议吗?
由于
答案 0 :(得分:1)
您的(?(?=SI)(?<matchfromend>[A-Z]+$)
正则表达式部分不会使用从字符串开头到结尾(?<matchfromend>[A-Z]+$
模式的任意字符。
您可以使用以下正则表达式:
'~^(?(?=SI).*#¤(?<matchfromend>.+$)$|(?<else>.*))~'
请参阅regex demo
解释:
^
- 字符串开头(?(?=SI).*#¤(?<matchfromend>.+$)$|(?<else>.*))
- 有条件的:
SI
出现在开头((?=SI)
),则匹配除了换行符之前的0 +字符,直到最后#¤
,并且除了换行符之外还会捕获1 +以外的字符字符串的结尾为Group&#34; matchfromend&#34; SI
,请将换行符以外的0 +字符匹配到该行的末尾。另一种非REGEX方法
检查字符串是否以SI
开头,如果是,则使用#¤
爆炸并获取最后一项。如果没有,请使用整个字符串。
请参阅IDEONE demo:
$str = "SI-#CL#¤1801 BARBER LANE#CL#MILPITAS CA 95035#CL#FONE 1-408-943-0600#CL#FAX 1-408-943-0484#CL#¤CANCEL BY 5 PM - RQST-NO FEATHER"; // => CANCEL BY 5 PM - RQST-NO FEATHER
//$str = "#CL#¤1801 BARBER LANE#CL#MILPITAS CA 95035#CL#FONE 1-408-943-0600#CL#FAX 1-408-943-0484#CL#¤CANCEL BY 5 PM - RQST-NO FEATHER";
$res = $str;
if (strrpos($str, "SI", -strlen($str)) !== false) { // starts with SI
$arr = explode("#¤", $str);
if (!empty($arr)){
$res = array_pop($arr);
}
}
echo $res;