Еще один вопрос preg_replace! - PullRequest
       8

Еще один вопрос preg_replace!

0 голосов
/ 07 октября 2009

У меня есть строка, состоящая из слов, сгруппированных вместе, и мне нужно разделить их, и каждое слово, оканчивающееся на 'A', вероятно, должно быть в новой строке,

item onea second itema third

Мне также нужно проверить, должно ли слово, оканчивающееся на 'A', действительно оканчиваться на 'A', как extra или sultana.

item oneasecond itemand an extra item

У меня есть массив слов, оканчивающихся на 'A' с этого сайта http://www.morewords.com/ends-with/a, поэтому мне просто нужна функция preg_replace.

Я действительно учусь каждый раз, когда кто-то отвечает на вопрос здесь, так что еще раз спасибо за все время и терпение

Ответы [ 4 ]

1 голос
/ 07 октября 2009

Вы можете сделать что-то вроде этого:

// assoc array keyed on words that end with A
$endsWithA = array("sultana" => 1, ...); 

$words = split(' ', $string);

$newString = '';
$finalStrings = array();

foreach ($words AS $w) {    
    // if it ends with a, check to see if it's a real word.
    // if so, end the current string and store it
    if (preg_match("/a$/", $w) && !$endsWithA[$w]) {
        $w = preg_replace("/a$/","", $w);
        $newString .= $w;
        $finalStrings[] = $newString;
        $newString = '';
    }
    else {
        $newString .= $w . ' ';
    }    
}

// Get any remaining newString
if ($newString) $finalStrings[] = trim($newString);

print_r($finalStrings);

Не проверял и т. Д., Но он дал бы вам массив $ finalStrings, заполненный строками, отделенными от оригинала.

Обновление: исправлено несколько опечаток в коде.

0 голосов
/ 07 октября 2009

Это больше похоже на работу для preg_match .

0 голосов
/ 07 октября 2009

Не уверен, что вы подразумеваете под ', и каждое слово, заканчивающееся на' A ', вероятно, должно быть в новой строке ' Всегда полезно, если вы публикуете фактический вывод помимо строки ввода.

Вы имеете в виду, что за словом, заканчивающимся на 'a', должна следовать новая строка (1)? Или что слово, заканчивающееся на «а», должно иметь новую строку перед ним? Или, может быть, сочетание этих двух слов, в результате которых слово, оканчивающееся на «а», будет помещено в их собственную строку (разрыв строки до и после слова)?

$words = "item onea second itema third";
print_r(preg_split("/\s+(?=\S+a)/i", $words));           // 1
print_r(preg_split("/(?<=a)\s+/i", $words));             // 2
print_r(preg_split("/(?<=a)\s+|\s+(?=\S+a)/i", $words)); // 3
0 голосов
/ 07 октября 2009

Учтите, что может быть полезно explode() строку, чтобы разделить ее на массив слов:

$words = explode(' ', $string);

Если они разделены пробелами.

Затем вы можете пройтись по массиву $words и проверить каждый из них на конечное «а», при необходимости выровняв его.

preg_replace() не всегда будет ответом на ваши потребности в текстовых манипуляциях.

РЕДАКТИРОВАТЬ: Если вы должны использовать preg_replace для каждого элемента $words, то

foreach ($words as $word) {
    $word = preg_replace('/(\w)a$/', '\1', $word);
}

Заметьте, я не пробовал этого, и сейчас я не помню, действительно ли это меняет массив, но я думаю, что регулярное выражение должно быть примерно правильным. Важным понятием является a $ , то есть буква a на конце строки из одного слова. Я думаю - это правильный синтаксис для замены буквы (\w), за которой следует буква 'a' в конце строки, просто буквой , но здесь уже очень поздно, и мой мозг может не работать .

Плюс, мы не принимаем во внимание ваш список из примерно 2900 слов, оканчивающихся на «а» (некоторые из которых я даже никогда не слышал из)

...