2010-08-09 72 views
4

我們有一個變量$string,它包含了一些文字,如:PHP串字母

About 200 million CAPTCHAs are solved by humans around the world every day. 

我們怎樣才能把每個字(其長度大於3個字母)的2-3最後或首字母

將檢查其匹配的文本與foreach()

if ('ey' is matched in the end of some word) { 
    replace 'ey' with 'ei' in this word; 
} 

感謝。

+0

當你說'每個單詞的符號'時,你的意思是什麼? – Svisstack 2010-08-09 21:59:52

+0

「million」:「m,i,l」是前三個符號,「i,o,n」 - 最後3個符號 – James 2010-08-09 22:11:53

+3

如果您使用「字母」而不是「符號」,則您的問題會立即更容易理解。 – meagar 2010-08-09 22:29:45

回答

3

首先,我我將給你一個如何遍歷字符串並處理字符串中的每個單詞的例子。其次,我將解釋代碼的每個部分,以便您可以根據自己的確切需求對其進行修改。


下面是如何切換出的最後兩個字母(如果他們是「安永」)每次超過3個字母詞。

<?php 
    // Example string 
$string = 'Hey they ey shay play stay nowhey'; 

    // Create array of words splitting at spaces 
$string = explode(" ", $string); 

    // The search and replace strings 
$lookFor = "ey"; 
$switchTo = "ei"; 

    // Cycle through the words 
foreach($string as $key => $word) 
{ 
     // If the word has more than 3 letters 
    if(strlen($word) > 3) 
    { 
      // If the last two letters are what we want 
     if (substr($word, -2) == $lookFor) 
     { 
       // Replace the last 2 letters of the word 
      $string[$key] = substr_replace($word, $switchTo, -2); 
     } 
    } 
} 
    // Recreate string from array 
$string = implode(" ", $string); 
    // See what we got 
echo $string; 
    // The above will print: 
    // Hey thei ey sashei play nowhei 
?> 

Live example


我會解釋每一個功能,讓您可以修改上面的確切你想要的,因爲我沒有準確地理解您的所有規格:

  1. explode()將採取一個字符串並將其拆分成一個數組。第一個參數是你用來分割它的。第二個參數是字符串,所以explode(" ", $string)將通過使用空格拆分$string。這些空格不會包含在數組中。
  2. foreach()將循環遍歷數組的每個元素。 foreach($string as $key => $word)將經過$string的每個元素,並且對於每個元素,它將索引號分配給$key和元素(在這種情況下的詞)到$word的值。
  3. strlen()返回字符串的長度。
  4. substr()返回字符串的一部分。第一個參數是字符串,第二個參數是子字符串的起始位置,第三個可選參數是子字符串的長度。如果是負數開始,則會從字符串的末尾到字符串的末尾計算開始時間。換句話說,substr($word, -2)返回從字符串的末尾開始兩個字符串的子字符串,並轉到字符串末尾......最後兩個字母。如果你想要前兩個字母,你會使用substr($word, 0, 2),因爲你從一開始就想要長度爲2個字母。
  5. substr_replace()將替換字符串中的子字符串。第一個參數是整個字符串。第二個參數是你的替換子字符串。第三個參數是替換開始的位置,第四個可選參數是子字符串的長度,因此substr_replace($word, $switchTo, -2)將採用$word並從倒數第二個字母開始,替換$switchTo。在這種情況下,我們將轉出最後兩個字母。如果要替換前兩個字母,則可以使用substr_replace($word, $switchTo, 0, 2)
  6. implode()與explode相反。它接受一個數組並使用指定的分隔符將其形成一個字符串。
+0

感謝的人,看起來很完美。我們可以檢查ar數組而不是字符串嗎? $ lookFor = array(ey,ay); $ switchTo = array(ei,ai); – James 2010-08-10 05:56:15

+1

@Ignatz - 看起來像你想要使用類似於:if(in_array(substr($ word,-2),$ lookFor))'來匹配單詞的結尾到$ lookFor數組。那麼你可以用'i'替換最後一個字母,因爲另一個字母保持不變。 ----(http://php.net/manual/en/function.in-array.php) – 2010-08-10 06:17:23

2
$string = 'About 200 million CAPTCHAs are solved by humans around the world every day.'; 
$result = array(); 
$words = explode(" ",$string); 
foreach($words as $word){ 
if(strlen($word) > 3){ 
    $result[] = substr($word,0,3); //first 3 characters, use "-3" for second paramter if you want last three 
} 
} 
+0

應該更具體一些,問題更新。 – James 2010-08-09 22:21:36

+1

if()的內部,如果你想要第一個和最後三個,你可以添加這個:'$ result [] = substr($ word,strlen($ word)-3);' – williamg 2010-08-09 22:28:31

+0

當然,downvote會在OP改變了問題... – 2010-08-09 23:05:21

1
function get_symbols($str, $reverse = false) 
{ 
    $symbols = array(); 

    foreach (explode(' ', $str) as $word) 
    { 
     if ($reverse) 
      $word = strrev($word); 

     if (strlen($word) > 3) 
      $word = substr($word, 0, 3); 

     array_push($symbols, $word); 
    } 

    return $symbols; 
} 

編輯:

function change_reverse_symbol_in_word($str, $symbol, $replace_to) 
{ 
    $result = ""; 

    foreach (explode(' ', $str) as $word) 
    { 
     $rword = $word; 

     if (strlen($rword) > 3) 
     { 
      $rword = substr($word, 0, -3); 
     } 

     if (!strcmp($symbol, $rword)) 
     { 
      $word = substr($word, 0, strlen($word) - strlen($rword)) . $replace_to; 
     } 

     $result .= $word . " "; 
    } 

    return $result; 
} 

如果你想用這個像你的問題,你必須調用此類似:

$string_malformed = change_reverse_symbol_in_word($str, "ey", "ei"); 
+0

最後或第一個符號呢? – James 2010-08-09 22:10:41

+0

@Ignatz:你有第二個參數bool決定你想要得到什麼符號,首先或最後;如果你想獲得最後的值,那麼將bool設置爲真值。 – Svisstack 2010-08-09 22:13:54

+0

我已經更新了這個問題。 – James 2010-08-09 22:21:06