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

时间:2013-03-19 18:40:29

标签: php regex

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

  紫色|葡萄汁
  绿色|生菜很好吃沙拉
  黄色|像香蕉一样的猴子   红|西瓜很好吃

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

如果一行中有3个管道,则表示不正确。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

?>

答案 2 :(得分: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;