2015-10-26 41 views
1

我需要得到"globe"之前和之後的字符串文本"hello,planet,globe,city,country"得到字前後

  1. 所以,我試圖" ,globe,"前得到了這個詞,直到前面的逗號,這意味着它應該返回"planet"。 我還需要返回下一個單詞"city"

  2. 如果單詞在字符串的開頭,則應該輸入 以前的單詞"no word"。 如果該單詞在字符串末尾,則應輸入 下一個單詞作爲"no word"

我該怎麼做?提前致謝。這是preg_match的最佳選擇嗎?

$word = "fsdfs"; 
$text = "hello,planet,globe,city,country"; 
preg_match('/[$word]+/', $text, $match); 
//the above sentence is wrong but wanted to emphasise that $word needs to mentioned in it 
print_r($match); 

回答

0

preg_match大概是這個錯誤的選擇。

你有幾個選擇,你可以用str_replace簡單地從字符串中刪除'globe',然後剩下的就是你想要的。

您也可以使用explode將字符串轉換爲數組並循環使用,當它匹配'globe'時只需跳過它即可使用implode將其變回字符串。

示例代碼:

$text = "hello,planet,globe,city,country"; 

$text = explode(',' , $text); 

$key = array_search ('globe', $text);//just globe, no comma 

echo $key;//key is 2 so 

if($key == 0) { 
    //first word so 
    //first word is 'no word 
} else { 
    echo $text[1]; //word before 
} 

//should also check array keys are set before using them 
echo $text[3];//word after 

更新時間:

$string = "hello,planet globe, city,country"; 

$regex = '/(?:[\w-]+){0,1}globe,(?: [\w-]+){0,1}/is'; 

preg_match_all($regex, $string, $matches); 

echo '<pre>'; 
print_r($matches); 
echo '</pre>'; 
+0

感謝堂妹的答案,但我忘了提及,作爲字符串文本將是一個很大的一個後,我不應該使用爆炸,所以,你可以請嘗試使用的preg_match或使preg_split功能? – goldy

0

沒有必要使用preg_match。您可以分割文本並搜索單詞的索引,並在檢查後返回左右兩個單詞。

function get_left_right_word($text, $word) 
{ 
    $words = explode(',', $text); 
    $i = array_search($word, $words); 
    return array(
     $i === false || $i == 0 ? 'no word' : $words[i-1], 
     $i === false || $i == count($words)-1 ? 'no word' : $words[i+1] 
    ); 
} 

list($left_word, $right_word) = get_left_right_word('hello,planet,globe,city,country', 'globe'); 
echo 'left: '.$left_word.' right: '.$right_word; 

這將打印

left: planet right: city 

如果你真的想使用preg_match你可以使用作爲

function get_left_right_word($text, $word) 
{ 
    if (preg_match('/(?:(?<left>\w+),)?'.preg_quote($word, '/').'(?:,(?<right>\w+))?/', $text, $m)) 
    { 
     return array(
      isset($m['left']) && $m['left'] ? $m['left'] : 'no word', 
      isset($m['right']) && $m['right'] ? $m['right'] : 'no word' 
     ); 
    } 
    return array(
     'no word', 
     'no word' 
    ); 
} 
+0

好吧,謝謝...但你知道如何編寫preg_match正則表達式嗎? – goldy

+0

@goldy我添加了'preg_match'示例 –

+0

**總是提供'preg_quote()'**的第二個參數,否則,如果分隔符出現在單詞中,它可能不會被轉義。 – nhahtdh

1
^(.*?),?\s*globe\K(.*)$ 

您可以使用此搶捕獲或組。 See demo.

$re = "/^(.*?),?\\s*globe\\K(.*)$/m"; 
$str = "hello,planet,globe,city,country\nglobe,city,country\nhello,planet,globe"; 

preg_match_all($re, $str, $matches);