2014-03-12 45 views
0

我在PHP中有一個存儲在變量$ row中的文本。我想找到某組詞的位置,這很容易。不容易的是讓我的代碼認識到它找到的單詞正是我正在尋找的單詞或更大單詞的一部分。有沒有辦法做到這一點?在字符串中找到一個特定的字php

的想什麼,我獲得

CODE

例子:

$row= "some ugly text of some kind i'd like to find in someway" 
$token= "some"; 
$pos= -1; 
$counter= substr_count($row, $token); 
for ($h=0; $h<$counter; $h++) { 
    $pos= strpos($row, $token, $pos+1); 
    echo $pos.' '; 
} 

OUTPUT:

我獲得:

0 17 47 

想什麼,我獲得

0 17 

任何提示?

+0

您的意思是0,18,48 :)您是否嘗試過使用單詞邊界的正則表達式? – Max

+0

嘗試給出'$ token =「some」;'(即你的令牌前後的空格)如果你只想要那個單詞的位置......希望我正確地得到了這個問題......如果不是那麼請試着詳述 –

+0

@ sumitb.mdi這可以工作幾乎完美..但如果令牌是在字符串的開始或結束呢? – Jannuzzo

回答

3

使用preg_match_all()與字邊界(\b):

$search = preg_quote($token, '/'); 
preg_match_all("/\b$search\b/", $row, $m, PREG_OFFSET_CAPTURE); 

這裏,preg_quote()語句用來正確逃生用戶輸入,以便在我們的正則表達式中使用它。有些字符在正則表達式語言中有特殊含義 - 如果沒有正確的轉義,這些字符將失去其「特殊含義」,並且您的正則表達式可能無法正常工作。

preg_match_all()語句中,我們提供的是以下的正則表達式:

/\b$search\b/ 

說明:

  • / - 開始符
  • \b - 單詞邊界。在大多數正則表達式中,單詞邊界是單詞字符(\w)與非單詞字符(\W)之間的位置。
  • $search - 逃過搜索詞
  • \b - 單詞邊界
  • / - 結束符

在簡單的英語,這意味着:找到給定詞some的所有出現。

請注意,我們也在這裏使用PREG_OFFSET_CAPTURE標誌。如果此標誌被傳遞,則對於每次發生的匹配,附屬字符串偏移量也將被返回。有關更多信息,請參閱the documentation

爲了得到你想要的結果,你可以簡單地遍歷$m陣列並提取偏移:

$result = implode(' ', array_map(function($arr) { 
    return $arr[1]; 
}, $m[0])); 

echo $result; 

輸出:

0 18 

Demo

+0

這是爲什麼downvoted? –

+0

答案尋求者希望'0 17'作爲輸出。你能建議他怎麼能從你的代碼中獲得? – Tzar

+0

@Tzar:他們希望得到的輸出可能是錯誤的。 '一些醜陋的文字' - 我在第二個's'之前看到** 18個字符**。也許這是原始問題中的計數錯誤? –

-1

使用preg_match()

if(preg_match("/some/", $row)) 
// [..] 

第一個參數是一個正則表達式,它可以匹配要匹配幾乎任何東西。但是,有關於使用它來匹配HTML之類的東西的dire warnings

+0

不要認爲這會解決OP的問題,但我已經編輯了「修復」代碼的答案。並刪除我downvote :) –

+0

你說得對,選定的答案好多了 - 此外,我誤解了這個問題。但是,謝謝 - –

2

什麼你」重新尋找是正則表達式與單詞邊界模式和返回o的標誌的組合ffset(PREG_OFFSET_CAPTURE)。

PREG_OFFSET_CAPTURE

如果該標誌,對每個出現的匹配結果附屬的 字符串偏移量也將返回。請注意,這改變了比賽的 值到一個數組,每一個元素是由匹配字符串的偏移量爲0,它的字符串偏移 爲主題的偏移1.

$row= "some ugly text of some kind i'd like to find in someway"; 
$pattern= "/\bsome\b/i"; 
preg_match_all($pattern, $row, $matches, PREG_OFFSET_CAPTURE); 

而且我們得到一個數組 這樣的事情:

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [0] => some 
        [1] => 0 
       ) 
      [1] => Array 
       (
        [0] => some 
        [1] => 18 
       ) 
     ) 
) 

而只是通過匹配循環,並提取在乾草堆中找到針的偏移量。

// store the positions of the match 
$offsets = array(); 
foreach($matches[0] as $match) { 
    $offsets[] = $match[1]; 
} 

// display the offsets 
echo implode(' ', $offsets); 
+0

答案尋求者希望'0 17'作爲輸出。你能建議他怎麼能從你的代碼中得到這個? – Tzar

+0

我已經添加了一些關於如何提取偏移量的片段。感謝您指出@Tzar – Max

+0

@Max是的!現在好多了! – Tzar

相關問題