PHP preg_match, чтобы найти соответствующее слово - PullRequest
2 голосов
/ 27 января 2012

У меня есть переменная со значением, подобным этому:

$sentence = "When it comes time to renew your auto insurance policy, be aware of how your carrier handles renewals";

И у меня есть переменные-массивы со значением ниже:

$searches = array('aware', 'aware of', 'be aware', 'be aware of');

$replaces = array('conscious', 'conscious of', 'remember', 'concentrate on');

Я хотел бы найти просто «быть в курсе», а затем заменить на «сосредоточиться на». Вывод как показано ниже:

Когда придет время продлять ваш полис автострахования, сконцентрируйтесь на том, как ваш перевозчик обрабатывает продления

Искать только «быть в курсе», как замена соответствующего синонима, а не другие. Спасибо за вашу помощь.

Хорошо, вот новый код:

$searches = array('aware of', 'be aware of', 'be aware', 'aware');

$replaces = array('conscious of', 'concentrate on', 'remember', 'conscious');

Это динамический массив ($searches), я надеюсь, вы понимаете ... и мы знаем, что наилучшая замена синонимов - это использовать '' быть в курсе '' для замены на 'сосредоточиться на'. Вывод как показано ниже:

Когда придет время продлять ваш полис автострахования, сконцентрируйтесь на том, как ваш перевозчик обрабатывает продления

Ответы [ 4 ]

1 голос
/ 27 января 2012

Здесь не нужно регулярное выражение,

Сначала отсортируйте ваш константный массив таким образом, чтобы он сначала нашел наибольшее совпадение:

$searches = array('be aware of', 'aware of', 'be aware', 'aware');
$replaces = array('concentrate on', 'conscious of', 'remember', 'conscious');

, затем используйте str_replace

$newsentence=str_replace($searches,$replaces, $sentence);
1 голос
/ 27 января 2012

Если вы измените порядок поиска, чтобы первый элемент не мог соответствовать элементу позже в массиве, вы можете использовать str_replace($searches, $replaces, $subject); как обычно!

$searches = array('be aware of', 'be aware', 'aware of', 'aware');
$replaces = array('concentrate on', 'remember', 'conscious of', 'conscious');

Если строка содержит «быть в курсе», «быть в курсе» не будет совпадать, а «знать» будет. Если бы у вас был обратный порядок, «осведомленный» соответствовал бы «знайте», что было бы неправильно.

1 голос
/ 27 января 2012

Я предполагаю, что ваш массив поиска и замены является статическим.

Попробуйте это,

str_replace($searches[3],$replaces[3],$sentence)

Также просто замените определенные «остерегаться», которые вы можете сделатьпросто:

str_replace("%be aware of%","concentrate on",$sentence)

0 голосов
/ 27 января 2012

Как насчет:

$sentence = "When it comes time to renew your auto insurance policy, be aware of how your carrier handles renewals";
$searches = array('aware', 'aware of', 'be aware', 'be aware of');
$replaces = array('conscious', 'conscious of', 'remember', 'concentrate on');

function cmp($a, $b) {
    if (strpos($a, $b) !== false) return -1;
    if (strpos($b, $a) !== false) return 1;
    return 0;
}

uasort($searches, 'cmp');
$replaces_new = array();
$i=0;
foreach($searches as $k=>$v) {
    $replaces_new[$i] = $replaces[$k];
    $i++;
}

$res = str_replace($searches, $replaces_new, $sentence);
echo $res;

выход:

When it comes time to renew your auto insurance policy, concentrate on how your carrier handles renewals
...