2010-08-09 3 views
4

У нас есть переменная $string, его содержит некоторый текст, как:PHP строковые буквы

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

Как мы можем получить 2-3 последних или первые буквы каждого слова (длина которых составляет более 3 букв) ?

будет проверять их на согласованный текст с foreach():

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

Спасибо.

+0

что вы имеете в виду, когда говорите «символы каждого слова»? – Svisstack

+0

«миллион»: «m, i, l» - первые три символа «i, o, n» - последние 3 символа – James

+3

Ваш вопрос будет сразу же понятнее, если вы использовали «буквы» вместо «символов». – meagar

ответ

3

Во-первых, я Приведем пример того, как прокручивать строку и работать с каждым словом в строке.

Во-вторых, я объясню каждую часть кода, чтобы вы могли изменить его в соответствии с вашими конкретными потребностями.


Вот как переключаться из последних 2 буквы (если они «еу») каждого слова, которое имеет длину более 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() - это противоположность взрыву. Он принимает массив и формирует его в строку, используя указанный разделитель.
+0

спасибо, человек, выглядит идеально. Можем ли мы проверить ar-массив вместо строк? $ lookFor = array (ey, ay); $ switchTo = array (ei, ai); – James

+1

@Ignatz - Похоже, вы хотели бы использовать что-то вроде: 'if (in_array (substr ($ word, -2), $ lookFor))', чтобы совместить конец слова с массивом $ lookFor. Тогда вы могли бы просто заменить последнюю букву на 'i', так как другая буква остается неизменной. ---- (http://php.net/manual/en/function.in-array.php) –

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

+1

Внутри if() вы можете добавить это, если хотите как первое, так и последнее три: '$ result [] = substr ($ word, strlen ($ word) -3);' – williamg

+0

Конечно, нижняя грань появляется после OP изменяет вопрос ... –

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; 
} 

EDIT:

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

+0

@Ignatz: У вас есть второй аргумент функции bool, определяющий, какие символы вы хотите получить, первый или последний; если вы хотите получить последний, тогда установите bool на истинное значение. – Svisstack

+0

Я обновил вопрос. – James

Смежные вопросы