【问题标题】:PHP regex find and replace in text and numbersPHP 正则表达式在文本和数字中查找和替换
【发布时间】:2013-07-11 22:15:22
【问题描述】:

我输入了这种格式:

文字编号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... 全球定位系统:12.3456,78.9012: 文字编号1:12.3456°,文字编号2:78.9012°。 还有更多文字...

"

输出需要在我搜索之前附加这个: "GPS:12.3456,78.9012:"

所有行中的 2 个数字也不同:12.3456 和 78.9012 其他都是固定的。 (空格,其他字符。)

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

(抱歉,文本格式无法正常工作。我修复了输入、输出,将“,”更改为空格)

谢谢!

【问题讨论】:

  • ok 使用 preg_match 提取数字。但是那里可以有其他数字吗?我们可以假设我们提取的数字总是###.#### 格式吗?
  • 数字格式:1-2个数字。 1-4 个数字。 1.1、22.1、1.22、1.333、1.4444 或 22.4444 都可以。我需要输入数字,然后需要生成附加文本(“GPS:number1,number2:”),然后用添加的输出替换输入(在输入文本行之前添加 GPS)。
  • Web.Guard 和 Pé de Leão 代码完美运行,两者都很棒!谢谢。

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


【解决方案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...

【讨论】:

  • 它接近完美,但我的输出是这样的:---- GPS:12.3456,78.9012 Bla bla bla, random text, bla bla... Text,number1: 12.3456°, text,number2: 78.9012 °。还有更多文字...... ---- 所以不要在 Text,number1 位置之前插入新文本,只是所有文本的开始位置。
  • 所以都在一条线上?这条线上是否有多个 GPS 坐标?
  • 是的,全部在 1 行,输入行:“Bla bla bla, random text, bla bla... Text,number1: 12.3456°, text,number2: 78.9012°. 还有更多文字。 ..” 并且需要输出行:“Bla bla bla, random text, bla bla ... GPS:12.3456,78.9012: Text,number1: 12.3456°, text,number2: 78.9012°. 还有更多文本......” 你可以看看区别。
  • 感谢所有回答。
【解决方案2】:
$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);

【讨论】:

  • 此输出:“Bla bla bla, random text, bla bla... Text,number1: GPS:12.3456,78.9012: Text,number1: 12.3456°, text,number2: 78.9012°.. 和更多文本”----需要“GPS:12.3456,78.9012:”在“文本,数字1:”文本之前。
  • 你是最快最好的,但很遗憾我犯了错误。不是这一行:“文本,编号 1:12.3456°,文本,编号 2:78.9012°。”这:“文本编号 1:12.3456°,文本编号 2:78.9012°。”。没有“,”,只是单词中的空格分隔符。我现在更新文本。对不起,是我的错。
  • 仍然无法正常工作,但这也是我的错,因为在输入中没有数字(例如,我添加了),所以这不是确切的输出:“文本编号 1:12.3456°,文本编号 2:78.9012°”这个: “文本 abcdég:47.9667°,文本 áécde:19.8333°。”因此,在 2 数字之前没有数字,只有带有重音符号的字母,例如 á、é 字符,例如“Text abcdég: 47.9667°, Text áécde: 19.8333°”。现在输出是这样的:“Bla bla bla, random text, bla bla...Text abcdé!!mxcmgps::47.9667,19.8333!! g: 47.9667°, Text áécde: 19.8333°.. 还有更多文字”
  • @FallenAngel - 带有口音的新更新。希望我理解正确。
【解决方案3】:
$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...

【讨论】:

  • 这也适用于更改的文本。伟大的!你也是最棒的!谢谢! :)
  • “文本,数字>”总是固定的吗?
  • 已修复,但没有数字,只有 2 个带有外来字符的不同文本,例如 éá,但它非常棒,工作正常!你很棒! :)
猜你喜欢
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多