我有许多在php中看起来都像这样的字符串:
10 NE HARRISBURG
4 E HASWELL
2 SE OAKLEY
6 SE REDBIRD
PROVO
6 W EADS
21 N HARRISON
我需要做的是从城市名称前面删除数字和字母。问题在于每个城市的数据差异很大,几乎从来不相同。是否可能将这些数据删除并将其保留在单独的字符串中?
请查看正则表达式和preg_replace函数。 $nameOfCity = preg_replace("/^\d+\s+\w{1,2}\s+/", "", $source);
解释如下:
^
匹配字符串的开头\d+\s+
以一个或多个数字开头,后跟一个或多个空格字符\w{1,2}\s+
接下来应该是一个或两个字母,后跟一个或多个空格字符未涵盖的情况
如果您想更精确地匹配,我认为您可以枚举在城市名称之前可能出现的所有字母 (S|SE|E|NE|N|NW|W|SW)
,而不是匹配任何一个或两个字母长的字符串。
对于每一行,尝试这样做:
$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
方法。
请尝试以下内容:
$new_str = preg_replace('/^([0-9]* \w+ )?(.*)$/', '$2', $str);
if(preg_match_all("/(\w+$)/", $source, $_matches)) {
$cities = $_matches[1];
}
explode()
。但是,上述方法对于多个单词的城市(如纽约和太阳谷)会失败。 - David Harknessexplode()
配合使用。 - William Durand