【问题标题】:PHP - Check if there is a word before AND behind a comma?PHP - 检查逗号前后是否有单词?
【发布时间】:2013-10-25 12:18:27
【问题描述】:

我希望用户输入他的城市和国家,用逗号分隔以将数据存储在我的数据库中。

现在我当前的代码是:

if (empty($_POST['location']) || substr_count($_POST['location'], ',') != 1) 

但这仅检查是否给出了一个逗号。我想检查逗号之前和之后是否有一个逗号和一个单词。 此外,这些词至少应该有 2 个字符,因为我猜没有一个国家或城市只有一个字符(?)。

编辑:我刚刚发现有些城市只有一个角色。所以请忘记我的最后一句话。

【问题讨论】:

  • 我认为这是 RegEx 的情况
  • 当您提供示例值时,我们更容易理解您要匹配的内容,例如 city,country -> ok, city,country, -> bad, ...
  • @ZathrusWriter 正确的格式是:city, country 这就是为什么只允许使用 1 个逗号,并且在该逗号之前和之后有一个字符串。

标签: php regex if-statement


【解决方案1】:

当然。 preg_match/,\s*\w{2,}/ 会告诉你:

if (preg_match('/,\s*\w{2,}/', $_POST['location'])) {
    //Yep - there's a comma followed by at least two characters in there!
}

尸检:

  • , - 文字 , 字符
  • \s* - 空格/制表符/换行符重复 0 到无限次
  • \w{2,} - 任何字母重复 2 次到无限次

您似乎也在检查空的。

<?php
    $invalid = false;
    $split = preg_split('/,\s*/', $_POST['location']);
    foreach ($split as $part) {
        if (strlen($part) < 2) {
            $invalid = true;
            break;
        }
    }

    if (!$invalid) {
        echo 'Success!';
    } else {
        echo 'Error!';
    }
?>

如果您需要一个正则表达式来为您完成这项工作,您可以这样做:

if (preg_match('/^(\w{2,},\s*)*(\w{2,})$/', $_POST['location'])) {
    echo 'Success!';
} else {
    echo 'Error!';
}

DEMO

OK    city,country   
ERROR ok, city,country,   
ERROR n, foo, bar   
ERROR foo, bar, n   
ERROR ,foo, bar, test   
OK    foo,bar   
OK    foobar

【讨论】:

  • “我正在检查空的”是什么意思?如果您询问我的代码,它应该检查不允许输入的内容,就像什么都不输入一样。
  • @Vay 我的正则表达式将允许foo, bar, foobar, 作为, bar, foobar 匹配它,即使它以逗号结尾。 explode 解决方案不会。
  • 我刚发现世界上有一个字符的城市,所以我将 2 更新为 1
  • @Vay 我已经添加了一个新的正则表达式,如果你愿意的话,它可以在没有explode 的情况下完成这项工作。在这里,您也可以将{2,} 更改为+ 以表示“重复一次或多次”。 /^(\w+,\s*)*(\w+)$/
  • @Vay "\pL - 来自任何语言的任何类型的字母。",所以是的 - 它应该适用于韩语、日语、俄语、捷克语等。你可以通过一些带有城市名称的开放数据库来验证城市。 Here's the first result for "country city database" on google.
【解决方案2】:

正则表达式是你的朋友

if(empty($_POST['location']) || !preg_match('/.+, .+/', $_POST['location'])

【讨论】:

  • 我有点困惑,因为我之前没有使用过RegEx。我无法让它以我想要的方式工作。我真正想要的是:1)以[a-zA-Z]格式开头的一个或多个字符。 2) 在第一个字符之后的整个输入字段中只允许有一个逗号。 3) [a-zA-Z] 格式的逗号后一个或多个字符。 4) 这个字符后面没有特殊字符、逗号或类似的东西。 5) 不允许空输入。 6) 不仅允许一个单词或字符不带逗号。 7)只有这种格式:城市,国家(用户是否在逗号后放置空格无关)
【解决方案3】:

这样做:

if(preg_match('/^.[a-zA-Z]+.( )?,.( )?.[a-zA-Z]+$/i', $_POST['location']))

【讨论】:

  • 我有点困惑,因为我之前没有使用过RegEx。我无法让它以我想要的方式工作。我真正想要的是:1)以[a-zA-Z]格式开头的一个或多个字符。 2) 在第一个字符之后的整个输入字段中只允许有一个逗号。 3) [a-zA-Z] 格式的逗号后一个或多个字符。 4) 这个字符后面没有特殊字符、逗号或类似的东西。 5) 不允许空输入。 6) 不仅允许一个单词或字符不带逗号。 7)只有这种格式:城市,国家(用户是否在逗号后放置空格无关)
  • 好的,试试我的新正则表达式,它应该非常适合你的情况;注意正则表达式周围的 ^$ 字符告诉它从头到尾进行比较
猜你喜欢
  • 2018-05-05
  • 2021-10-16
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多