使用PHP从字符串中删除行开头的数字

5

我有许多在php中看起来都像这样的字符串:

10 NE HARRISBURG
4 E HASWELL
2 SE OAKLEY
6 SE REDBIRD
PROVO
6 W EADS
21 N HARRISON

我需要做的是从城市名称前面删除数字和字母。问题在于每个城市的数据差异很大,几乎从来不相同。是否可能将这些数据删除并将其保留在单独的字符串中?

4个回答

7

请查看正则表达式和preg_replace函数。 $nameOfCity = preg_replace("/^\d+\s+\w{1,2}\s+/", "", $source);

解释如下:

  1. ^匹配字符串的开头
  2. \d+\s+以一个或多个数字开头,后跟一个或多个空格字符
  3. \w{1,2}\s+接下来应该是一个或两个字母,后跟一个或多个空格字符
  4. 其余部分应该是城市的名称。

未涵盖的情况

  • 如果城市名前只有文本限定符
  • 如果城市名前只有数字限定符
  • 如果城市名前只有数字限定符,且城市名为两个字母长。

如果您想更精确地匹配,我认为您可以枚举在城市名称之前可能出现的所有字母 (S|SE|E|NE|N|NW|W|SW) ,而不是匹配任何一个或两个字母长的字符串。


1

对于每一行,尝试这样做:

$arr = preg_split('/ /', $line);

if(count($arr) === 3)
{
    // $arr[0] is the number
    // $arr[1] is the letter
    // $arr[2] is your city
}
else
{
    // Like "PROVO" no number, no letter
}

是的,这段代码很糟糕,但它能工作... 而且它保留了你所有的数据。 重要的是要使用preg_split而不是已弃用的split方法。


preg_match会不会更适合呢?特别是当城市名包含两个或更多单词时,例如纽约、圣马力诺、法兰克福。 - Aleksi Yrttiaho
鉴于您正在使用非正则表达式进行拆分,您可以使用 explode()。但是,上述方法对于多个单词的城市(如纽约和太阳谷)会失败。 - David Harkness
是的... 根据 explode 文档,$limit = 3 应该可以很好地与 explode() 配合使用。 - William Durand

1

请尝试以下内容:

$new_str = preg_replace('/^([0-9]* \w+ )?(.*)$/', '$2', $str);

1
如果您想将城市列表作为数组获取,请尝试:
if(preg_match_all("/(\w+$)/", $source, $_matches)) {
  $cities = $_matches[1];
}

与William Durands的解决方案相同,这种方法无法匹配包含多个单词的城市名称。表达式必须包含不需要的部分,并带有零或一个限定符。此外,preg_match_all有点不必要,因为只有一种可能的匹配。但也没有什么坏处。 - Aleksi Yrttiaho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接