2008-10-21 77 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