PHP preg_replace - 正则表达式
Posted
技术标签:
【中文标题】PHP preg_replace - 正则表达式【英文标题】:PHP preg_replace - regex 【发布时间】:2012-02-09 16:45:09 【问题描述】:我仍在研究正则表达式并一点一点地学习。这个让我头疼。我有一个类似下面的字符串:
".......mapsearch"), '52.486683, -4.044363', options......"
我想从字符串中检索 2 个数字(long 和 lat)——我不介意我是否将它们作为一个完整的字符串一起检索,中间包含逗号和空格。
我知道我想使用表达式来匹配并忽略从开始到 mapsearch"), '
的任何内容,包括字符串的结尾到 ', options
模式。
更新
该字符串还将包含一系列其他字符,例如 ( ) = : / 以及所需匹配前后的数字..
【问题讨论】:
为什么不在,
上爆炸,然后循环检查它是否是一个浮点数/整数来保留它?
字符串中只有这两个数字吗?
这是 CSV 文件中的一行吗?你最好使用解析器。
@将发布更长的字符串。
【参考方案1】:
这会起作用,尽管它很丑:
/mapsearch\"\), '(-?\d+(?:\.\d+)?), (-?\d+(?:\.\d+)?)', options/
数字可以是负数或正数,也可以匹配整数和十进制值。该模式会将这两个数字作为一个单独的组返回。
【讨论】:
(-?\d+(?:.\d+)?)
工作原理的细分:-?
查找一个可选的前导负号,后跟多个数字 (\d+
)。在最初的一组数字之后,我们想要匹配一个小数和一个数字的数量((?:.\d+)?
),但我们不希望它是它自己的捕获组(?:
)。
返回一个包含 3 个项目的数组 - 其中第一个,第二个和第三个返回每个变量 - 仍然有效。谢谢。
preg_match(以及我见过的大多数其他正则表达式匹配器)将始终将完整匹配作为第一组返回。这就是为什么有 3 个项目。【参考方案2】:
preg_match("/'([^,]+), ([^']+)'/", $string, $matches);
echo $matches[0]; // 52.486683
echo $matches[1]; // -4.044363
【讨论】:
【参考方案3】:假设它是单引号中唯一的数字:
'-?\d+.\d+, -?\d+.\d+'
【讨论】:
【参考方案4】:你可以试试这个:
(\-?[0-9]+\.[0-9]+\,\ \-?[0-9]+\.[0-9]+)
提取
52.486683,-4.044363
【讨论】:
【参考方案5】:在这种情况下,我会使用 metalfrog 的解决方案并进行一些更改。
如果你确定只有字符串有逗号,没有别的,然后分解,检查它是否是整数/浮点数,或者如果你知道它是第 n 项,只需获取 $array[$n]。
否则爆炸并使用this(需要一些编辑)来确定它是否是一个坐标。
【讨论】:
【参考方案6】:$subject = ".....mapsearch\"), '52.486683, -4.044363', options......";
$regex = '/mapsearch\"\), \'(-?[0-9]1,3\.[0-9]6, -?[0-9]1,3\.[0-9]6)\', options/';
if (preg_match($regex, $subject, $matches))
print_r($matches);
这会给你:
Array
(
[0] => mapsearch"), '52.486683, -4.044363', options
[1] => 52.486683, -4.044363
)
【讨论】:
以上是关于PHP preg_replace - 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
PHP中使用正则表达式详解 preg_match() preg_replace() preg_mat
php 中preg_replace执行一个正则表达式的搜索和替换
PHP 删除/替换 - href / anchor / link - 在html / string中 - preg_replace - php - regex - 正则表达式
php正则替换函数-----preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1