用php中的正则表达式测试管道分隔的格式


Test pipe delimited format with regular expression in php

我需要验证字符串是否为以下格式,否则我需要返回一条警告消息。

紫|葡萄汁
绿色|生菜配沙拉很好
黄色|猴子喜欢香蕉
红|西瓜好吃

我需要它在管道分隔的数据中,如上所述,每一行都被分割成两个块,然后是一个新行。

如果一行中有3个管道,则这是不正确的。

此RegEx将根据您的规范验证整个字符串:^('w+'|['w ]+('n|$))+$
如果其中一行无效,preg_match()将返回false
注意:我假设左边部分只有数字和字母,第二部分有相同的加号空格
在这里观看直播:http://regex101.com/r/iV0tC4

所以你需要的所有代码都是:

if (!preg_match($regex,$string)) trigger_error("Invalid string!",E_USER_WARNING);

实时代码:http://codepad.viper-7.com/i3Hcjs

我不确定你想要得到什么,但如果我猜你需要这样的东西:

<?
$lines = explode("'n",$str);
foreach ($lines as $lineIndex => $oneLine)
    if (count(explode('|',$oneLine))>2) echo "You have an error in line ".$lineIndex;
?>

RegExp匹配就是您所需要的。将字符串拆分成新行,然后在每行上运行RegExp匹配,如果匹配返回false,则提前结束函数(短路(。RegExp本质上是START_OF_LINE(^(和任何不是管道的东西([^''|](和管道(''|(以及任何不是管道([^'' |](的东西和END_OF_LINE($(。

function verify($str) {
    $regex = '/^[^'|]*'|[^'|]*$/';
    $all = explode("'n", $str);
    foreach($all as $line) {
        if(preg_match($regex, $line) == false) 
            return false;
    }
    return true;
}
echo verify("bad") === false;
echo verify("bad|bad|bad") === false;
echo verify("abc|123'nbad") === false;
echo verify("abc|123'nbad|bad|bad") === false;
echo verify("good|good") === true;
echo verify("good|good'nnice|nice") === true;