【问题标题】:PHP Finding Match in String, Changing it Then Using Updated StringPHP 在字符串中查找匹配项,然后更改它然后使用更新的字符串
【发布时间】:2021-02-09 17:33:22
【问题描述】:

我一直在寻找,直到我脸色发青,但还没有找到解决方案。我想检查一个字符串以查看其中是否包含 2 个字母的状态缩写之一。我可以找到它并将其大写,但如果它是单词的一部分,它也会将缩写大写(我不希望它这样做)。

我下面的代码输出“想在东华盛顿工作吗?”

当我希望它输出“Want To Work In Eastern WA?”时。

这是我正在使用的东西,希望有人能告诉我我做错了什么。谢谢!

$newheading = "Want To Work In Eastern Wa?";  // This variable is not always the same.  
$states = "Al Ak Az Ar Ca Co Ct De Fl Ga Hi Id Il In Ia Ks Ky La Me Md Ma Mi Mn Ms Mo Mt Ne Nv Nh Nj Nm Ny Nc Nd Oh Ok Or Pa Ri Sc Sd Tn Tx Ut Vt Va Wa Wv Wi Wy";
    $pieces = explode(" ", trim($newheading));
    
    foreach($pieces as $v) {
            if ((strlen($v) == 2) && ($v != "In") && ($v != "Or")) {
                $newv = strtoupper($v);
                $out =  str_replace($v, $newv, $pieces);
                $out = implode(" ", $pieces);
                $newheading = $out;
                break;
            }
    }

【问题讨论】:

  • 你放弃了吗?

标签: php explode implode


【解决方案1】:

您可以使用正则表达式加入 OR | 上的状态并查找单词边界 \b 或空格 \s

$states = explode(' ', $states);  // or just define as an array
$states = implode('|', $states);

$newheading = preg_replace_callback("/\b($states)\b/", function($m) {
                                                           return strtoupper($m[0]);
                                                       }, $newheading);

我不确定你在用 "In""Or" 做什么,但只需将它们从 $states 中删除即可。

例如,如果字符串可能包含wawA,那么您需要在末尾添加i 修饰符以不区分大小写。

【讨论】:

  • $newheading 中的单词并不总是相同的。您的代码是否说明了这一点?看起来它只是检查第一个单词。并感谢您的回复。
  • 它检查所有的单词。 preg_replacepreg_replace_callback 查找所有匹配项 3v4l.org/HaQ8g 在我的示例中,我添加了 i 修饰符来捕获 catx
猜你喜欢
  • 2016-04-28
  • 1970-01-01
  • 2016-03-04
  • 2012-11-12
  • 1970-01-01
  • 2015-02-02
  • 2021-02-22
  • 2015-05-20
  • 2018-10-06
相关资源
最近更新 更多