使用数组分隔字符串

时间:2010-11-29 01:36:02

标签: php arrays string

我有一个字符串,其中包含一个名称后跟一个城镇。就像John Smith Smithville

一样

我需要将其分为两个变量(nametown)或数组。

我有一系列城镇名称要检查。什么是在字符串中找到城镇名称后将字符串分成两个的最佳方法?

$string = "John Smith Smithville";
$townlist = array("smithville", "janeville", "placeville");

if(contains($string,$townlist))
{
//separate into two variables

}

3 个答案:

答案 0 :(得分:6)

这使用正则表达式来完成它。

  • 为正则表达式获取城镇名称的转义版本。确保你的名字城镇名称中没有/,或者我们不能使用array_map()preg_quote()的第二个参数是分隔符。)
  • 使用管道|加入他们。
  • 字符串构建并运行正则表达式。
  • $matches的名称为1,城镇的名称为2

PHP

$string = 'John Smith Smithville';
$townlist = array('smithville', 'janeville', 'placeville');

if (preg_match_all(
      '/^(.*)\s(' . implode('|', array_map('preg_quote', $townlist)) . ')$/i',
      $string,
      $matches
))
{
    var_dump($matches);
}

It works!

输出

array(3) {
  [0]=>
  array(1) {
    [0]=>
    string(21) "John Smith Smithville"
  }
  [1]=>
  array(1) {
    [0]=>
    string(10) "John Smith"
  }
  [2]=>
  array(1) {
    [0]=>
    string(10) "Smithville"
  }
}

答案 1 :(得分:1)

这就是我认为的伎俩

  • 对于列表中的每个项目,获取原始字符串中的位置
  • 如果我们得到一个职位,我们就知道它在字符串
  • 创建第一部分和第二部分的数组
  • 从循环中断,因为我们找到了我们需要的东西
  • 返回值
  • 如果我们找不到任何内容,则返回一个空数组

应该工作,做了一些测试。

$string = "John Smith Smithville";
$townlist = array("smithville", "janeville", "placeville");

function stringSeperation($string, $list)
{
    $result = array();

    foreach($list as $item)
    {
        $pos = strrpos(strtolower($string), strtolower($item));
        if($pos !== false)
        {
            $result = array(trim(substr($string, 0, $pos)), trim(substr($string, $pos)));
            break;
        }
    }

    return $result;
}

var_dump(stringSeperation($string, $townlist));

答案 2 :(得分:0)

您是否考虑过“特殊情况”,例如:“约翰史密斯纽约”?或“纽约纽约”(名称可以包含空格,人名可以与城市相同)

我认为更合适的解决方案是:对于每个字符串str,我们检查所有城市名称。检查程序是(伪代码):

foreach str in strArray[]
  foreach city in cities

     tmp = Get the substring in the end of str, which equal the length of the "city"
     if (tmp == city) then {name = substring(str, 0, strlen(str) - strlen(tmp)); break;}