PHP正则表达式在文本和数字中查找和替换

时间:2013-07-13 13:34:45

标签: php regex preg-replace preg-match text-processing

我输入的格式是:

文字编号1:12.3456°,文字编号2:78.9012°。

我想用PHP代替这里:

GPS:12.3456,78.9012:    文字编号1:12.3456°,文字编号2:78.9012°。

再次,大文字输入:

Bla bla bla,随机文字,bla bla ... 文字编号1:12.3456°,文字编号2:78.9012°。 更多文字......

此输出需要:

Bla bla bla,随机文字,bla bla ... GPS:12.3456,78.9012: 文字编号1:12.3456°,文字编号2:78.9012°。 更多文字......

输出需要在我搜索之前追加: “GPS:12.3456,78.9012:

这两个数字在所有行中也有所不同:12.3456和78.9012 所有其他都是固定的。 (空格,其他角色。)

如果您现在如何从大文本中检测并获取此行: “Text number1: 12.3456°, text number2: 78.9012°.” 也有帮助。 如果我有这条线,我可以找到数字并替换。 我将使用explode来检测数字(在数字之前和之后找到空格)和str_replace来替换输出到输出。我知道这不是最好的方式,但我知道这些功能。

(抱歉,文字格式不能正常工作。我修改输入,输出,更改“,”到空格)

谢谢!

3 个答案:

答案 0 :(得分:2)

$text = 'Bla bla bla, random text, bla bla... Text,number1: 12.3456°, text,number2: 78.9012°. And more text...  ';

echo preg_replace('%([\w\s,]+:\s(\d+\.\d+)°,\s[\w\s,]+:\s(\d+\.\d+)°)%ui', ' GPS:$2,$3: $1', $text);



//Output: Bla bla bla, random text, bla bla... GPS:12.3456,78.9012: Text,number1: 12.3456°, text,number2: 78.9012°. And more text...

答案 1 :(得分:1)

它不漂亮,但我晚餐很晚了!

<?
$text = 'Bla bla bla, random text, bla bla...
Text,number1: 12.3456°, text,number2: 78.9012°.
And more text...';

$lines = array();
foreach(explode("\r\n",$text) as $line){
    $match = array();
    preg_match_all('/\d{0,3}\.?\d{0,20}°/', $line, $result, PREG_PATTERN_ORDER);
    for ($i = 0; $i < count($result[0]); $i++) {
        $match[] = $result[0][$i];
    }
    if(count($match)>0){
        $lines[] = 'GPS:'.str_replace('°','',implode(',',$match));
    }
    $lines[] = $line;

}
echo implode('<br>',$lines);
?>

Bla bla bla, random text, bla bla...
GPS:12.3456,78.9012
Text,number1: 12.3456°, text,number2: 78.9012°.
And more text...

答案 2 :(得分:1)

$text = 'Bla bla bla, random text, bla bla...
Text number1: 12.3456°, text number2: 78.9012°.
And more text';
$pattern = '#[a-zá-úàü\d ,]+:\s?([\d.]+)°[^:]+:\s?([\d.]+)°#i';
return preg_replace_callback($pattern, function($match) {
    return sprintf("GPS:%s,%s:\n%s.",
        $match[1],
        $match[2],
        $match[0]
    );
}, $text);