Войти

Показать полную графическую версию : Регулярное выражение - вырезать все кроме указанных в масиве слов


venuko
29-01-2009, 16:05
Есть переменная в ней хранятся все страны:

$country = "Австралия, Андора, Австрия, Россия, Украина, Германия";

и т.д. все страны.

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

$content=strip_tags($content);

дальше нужно из этого контента вырезать все, кроме одного слова - название страны (в контенте всего один раз встречается любое из названия стран), если оно входит в список $country и вывести название страны на экран!

Подскажите, плиз, буду признателен, спасибо!

venuko
29-01-2009, 17:14
хм, эта задача сложна?

Sham
29-01-2009, 18:48
у вас логика непонятная... зачем ради одного слова вырезать теги и все остальное?

Sham
29-01-2009, 19:32
вам нужно привести примерно к такому виду (список стран вставить в шаблон, предварительно обработав)
if(preg_match('/Австралия|Андора|Австрия/i', $content, $matches)) echo $matches[0];

venuko
29-01-2009, 20:56
Не пойму, в чем ошибка:

$country = "Австралия|Андора|Австрия";

$content="Здесь <i>описание</i> страны Австралия. Также <b>другой</b> тест и так и далее!";
$content=strip_tags($content);

if(preg_match('/$country/i', $content, $result))

echo $result[0];

Подскажите, плиз :(

venuko
29-01-2009, 21:15
нашел ошибку, но теперь проблема в другом:

$country = 'Австралия|Андора|Австрия';

$content="Здесь <i>описание</i> страны Австралиядский. Также <b>другой</b> тест и так и далее!";
$content=strip_tags($content);

if(preg_match("/$country/i", $content, $result))

echo $result[0];

В контенте слово Австралиядский, а скрипт результат выдает Австралия, это неправильно, так нужно точное вхождение слова, а не его какое-либо склонение.

все понял, нужно было \b добавить :)

if(preg_match("/\$country\b/i", $content, $result))

venuko
29-01-2009, 21:36
В чем может быть проблема, скрипт работает, но если мы не указали в переменной $country какую то страну или её вообще нет в контенте, то эта информация в цикле не выводится :( как сделать так, чтобы если есть страна то пусть выводится, если нет такой страны в списке, то выводить надпись "Не известно":

while ($row = $db->sql_fetchrow($result)) {
$id = $row['id'];
$title = stripslashes($row['title']);
$article = stripslashes($row['article']);

$country = 'Франция|Германия|США|Россия';
$content = $article;
$content=strip_tags($content);
if(preg_match("/$country/i", $content, $result2))

echo "<p>$title";
echo "&nbsp; - $result2[0]</a>";
echo "</p>";

}

venuko
29-01-2009, 21:58
А этот вариант, правильней?

while ($row = $db->sql_fetchrow($result)) {
$id = $row['id'];
$title = stripslashes($row['title']);
$article = stripslashes($row['article']);

$country = 'Франция|Германия|США|Россия';
$content = $article;
$content=strip_tags($content);
if(preg_match("/$country/i", $content, $result2)) {
echo "<p>$title</p>";
echo "<p>$result2[0]</p>";
} else {
echo "<p>$title</p>";
echo "<p>$article</p>";
}



}

Sham
30-01-2009, 03:05
все понял, нужно было \b добавить »
не, тогда подмаску нужно юзать
if(preg_match("/({$country})\b/i", $content, $result))
{
echo "<p>$title</p>";
echo "<p>$result[0]</p>"; // или $result[1]
}
else // если страна не найдена
{
echo "<p>$title</p>";
echo "<p>$article</p>";
}

не понятно, зачем у вас strip_tags и stripslashes (и без этого будет работать)...

+ нужно позаботиться чтобы в $country не было служебных символов (preg_quot уже не прокатит)...

venuko
30-01-2009, 08:11
не, тогда подмаску нужно юзать »

подмаска, это это?

+ нужно позаботиться чтобы в $country не было служебных символов (preg_quot уже не прокатит)... »
({$country})

Каких служебных символов, точек, запятых и т.д.?

Sham
30-01-2009, 09:35
venuko, http://ru.php.net/manual/ru/regexp.reference.php читаем внимательно...

venuko
30-01-2009, 09:38
venuko, http://ru.php.net/manual/ru/regexp.reference.php читаем внимательно... »


уже читаю, пасиб :)

Sham
30-01-2009, 09:42
Каких служебных символов, точек, запятых »
т.е. в названиях стран не было служебных символов, потому как если загнать $country в preg_quote, то экранируются все "|"...

venuko
30-01-2009, 09:43
ок, понял, спасибо за подсказку

а в чем рзница между этими значениями 0 или 1 ?


echo $result[1];

echo $result[0];

Sham
30-01-2009, 09:51
http://ru.php.net/manual/ru/function.preg-match.php

0 - совпадение целиком, 1 - первая подмаска (там это одно и то же)




© OSzone.net 2001-2012