验证多行文本,以便所有行都包含具有严格的管道分隔格式的文本

Validate multiline text so that all lines contain text with a strict, pipe-delimited format

假设我们的输入可能包含一行或多行文本,并且所有行都必须遵守严格的格式。

number|any character(s)|number

例如:

150|example.com/|2500
600|hello_world|1500

中间的字符可以包含任何字符,不包括空格。开头和结尾的数字可以是单个数字,也可以是多个数字。

我想检查文本中的所有行是否都符合要求的格式。

到目前为止,我想出了以下正则表达式,但它 returning true 即使只有一行与上面的格式匹配。

/[0-9]+\|.*?\|[0-9]/im

如何调整我的模式以验证整个文本和 preg_match() 中的 return true

您可以使用

/\A([0-9]+\|\S*\|[0-9]+)(?:\R(?1))*\z/

regex demo详情:

  • \A - 字符串开头
  • ([0-9]+\|\S*\|[0-9]+) - 第 1 组:一位或多位数字,|,任意零个或多个非空白字符,尽可能多,|,以及一位或多位数字
  • (?:\R(?1))* - 换行零次或多次重复,然后是第 1 组模式
  • \z - 字符串结尾。

PHP demo

$text = "150|google.com/|2500\n600|hello_world|1500";
if (preg_match('~\A([0-9]+\|\S*\|[0-9]+)(?:\R(?1))*\z~', $text)){
    echo "Valid!";
}
// => Valid!