1

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

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

我需要它在上面的管道分隔数据中,每行分成两个块,然后是一个新行。

如果在一条线上有 3 个管道,那么它是不正确的。

4

3 回答 3

1

此 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

于 2013-03-19T19:16:26.260 回答
0

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;
于 2013-03-19T19:19:13.650 回答
0

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

<?
$lines = explode("\n",$str);

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

?>
于 2013-03-19T18:48:13.037 回答