2008-10-21 87 views
4

我有一个正在使用sed的正则表达式,但现在我需要使其在PHP中也能工作。我禁止使用系统调用。将sed字符串转换为PHP

 
$ cat uglynumber.txt: 
Ticket number : 303905694, FOO:BAR:BAR: Some text 
Case ID:123,456,789:Foobar - Some other text 
303867970;[FOOBAR] Some text goes here 
Case Ref: 303658850 - Some random text here - host.tld #78854w 
 
$ cat uglynumbers.txt | sed "s/[, ]//g;s/.*\([0-9]\{9\}\).*/\1/g" 
303905694 
123456789 
303867970 
303658850 

那么,如何做PHP一样吗?

我发现了一个这样的例子,但我不能注入该正则表达式。

 
if (preg_match("/.../", $line, $matches)) { 
    echo "Match was found"; 
    echo $matches[0]; 
} 
+0

接受那个帮助你的答案。 :) – Till 2008-10-22 01:48:23

回答

2

你的具体例子SED显然是2的正则表达式,1为取代逗号,和一个在技术上敛9位连续号码。

SED字符串的前半部分最适合preg_replace()函数。

//`sed s/regex/replace_value/flags` 

preg_replace('/regex/flags', 'replace_value', $input); 

您的SED串下半年将是一个preg_match_all()

//`sed ...;s/regex/\1/flags` 

$matches_array = array(); 
preg_match_all('/regex/flags', $input, &$matches_array); 

所以您的特定代码看起来是这样的:

<?php 
$input = file_get_contents('uglynumbers.txt'); 

$input = preg_replace('/[, ]/m','', $input); 

$matches = array(); 
//No need for the .* or groupings, just match all occurrences of [0-9]{9} 
if(preg_match_all('/[0-9]{9}/m', $input, $matches)) 
{ 
    //... 
    var_dump($matches); 
} 

它看起来像g是SED修饰符意思是匹配所有行。 preg_match_all()应该已经处理此修改器,但m看起来像是根据PCRE modifiers手册中的适当替换。

+0

我有这个每个测试的问题: 警告:preg_replace()[function.preg-replace]:未知修饰符'g'在... – boogie 2008-10-21 22:25:05

1

尝试使用的preg_replace()代替preg_match()grepsedpreg_matchpreg_replace

2

preg_replace()是您正在查找的功能。可以传递的图案阵列,并且替换参数

$pattern = array('/[, ]/','/.*\([0-9]\{9\}\).*/'); 
$replace = array('','$1'); 

foreach($lines as $line) { 
    $newlines[] = preg_replace($pattern, $replace, $line); 
} 
+0

PHP中没有`g`修饰符。 `preg_replace()`默认会替换所有的东西,并有一个可选的参数来限制它。 – HamZa 2014-03-02 13:11:56