Небольшое рег. выражение

12
S
На сайте с 10.08.2006
Offline
115
1179

есть строка: <a href="http://site.ru">это ссылка</a> это не ссылка

каким выражением можно найти текст, что НЕ является ссылкой (не находится в тегах <a bla-bla> </a>)?

то, что является ссылкой ищется отлично, а вот наоборот не получается

stealthy
На сайте с 15.06.2006
Offline
69
#1

Постановка задачи некорректна, т.к. вы не пишете чем блок текста ограничен у вас справа. Если у вас там конец строки, например, то:

$str =~ /<A [^>]+>(.*?)$/si;

поместит все что после вашей ссылки в $1 (Perl, но в ПХП все примерно то же самое). Если у вас справа не конец строки а что-то другое, то вместо доллара вы рисуете регекс на правую часть, а все что между левой и правой известными частями - будет ваш искомый блок.

Twilight CMS (http://www.twl.ru): есть Free версия, очень проста и удобна в использовании. Консультирую по любым вопросам. Новый спорт - практическая стрельба (http://nikit.in) - не для офисного планктона.
S
На сайте с 10.08.2006
Offline
115
#2
stealthy:
Постановка задачи некорректна, т.к. вы не пишете чем блок текста ограничен у вас справа. Если у вас там конец строки, например, то:

$str =~ /<A [^>]+>(.*?)$/si;

поместит все что после вашей ссылки в $1 (Perl, но в ПХП все примерно то же самое). Если у вас справа не конец строки а что-то другое, то вместо доллара вы рисуете регекс на правую часть, а все что между левой и правой известными частями - будет ваш искомый блок.

пример строк:

$string = '<a href="http://site.ru">это ссылка</a> это не ссылка';

$string = '<a href="http://site.ru">это ссылка</a> это не ссылка ';

т.е. может быть и конец строки и не конец. искаться будет не весь текст, что не является ссылкой (анкором ссылки), а лишь некоторое совпадение с искомым значением (например $template = "это не ссылка")

>>$str =~ /<A [^>]+>(.*?)$/si;

думаю, что правильно записал, но работать не захотело. preg_replace("/<A [^>]+>(.*?)$/si/","123",$str);

stealthy
На сайте с 15.06.2006
Offline
69
#3
Shadow:
может быть и конец строки и не конец

перед тем как что-то делать нужно четко сформулировать алгоритм. это - не алгоритм. нужно четко понять что и по каким правилам будет искаться. и потом уже решать - либо искать "что-то", либо "все кроме чего-то". либо искать "нечто" и потом вторым (третьим и т.д.) проходом чистить до состояния "что-то".

Shadow:
искаться будет не весь текст, что не является ссылкой (анкором ссылки), а лишь некоторое совпадение с искомым значением (например $template = "search name")

тут совсем ничего не понял.

если касательно конкретной строки где пробелы в конце могут быть, а могут и не быть - перед $ ставится \s*

но по переводу человеческих регекспов на php функции - это, к сожалению, не ко мне.

S
На сайте с 10.08.2006
Offline
115
#4

есть искомое значение ($template = "это не ссылка"), это значение не должно быть ссылкой

например строка:

$string = '<a href="http://site.ru">это ссылка</a> это не ссылка';

в ней нужно найти $template (т.е. текст "это не ссылка" и этот текст не должен являться анкором ссылки, т.е. он не должен быть внутри тега <a>)

p.s.

строка может быть такой:

$string = '<a href="http://site.ru">это ссылка</a> это не ссылка';

и такой:

$string2 = '<a href="http://site.ru">это ссылка</a> <a href="http://site.ru">это не ссылка</a> бла-бла';

текст "это не ссылка" должен быть найден в первой строке, но никак не во второй (т.к. во второй он является анкором ссылки)

invoice
На сайте с 06.07.2006
Offline
49
#5

if (preg_match("/<\/a>.*?".$template.".*?/",$string)) {

....

}

Тоже не до конца понял условия :)

Может так?

stealthy
На сайте с 15.06.2006
Offline
69
#6

Короче чем дальше в лес тем толще партизаны. Каждое последующее уточнение только хуже делает. Если вам нужно найти заранее известную подстроку при условии что она не находится внутри анкора (тэга А), то вам нужно первым проходом почистить текст от тэгов, а вторым искать текст. Но что вы этим получите - непонятно, разве что можно посчитать количество вхождений (плотность что-ли считаете?). Если вы хотите найти позиции в тексте, для дальнейшей обработки то можно не чистить текст первым проходом, а заменить ссылки на аналогичное число символов. И так далее.

Для каждой задачи есть решение и не одно. Но задачу нужно уметь корректно поставить. Иначе вы и сами её решить не сможете.

S
На сайте с 10.08.2006
Offline
115
#7

в обобщённом виде задача описана в первом посте: найти в строке текст, который не находится внутри тега <a>. дан пример строки.

ведь таким образом /<a.*?>(.*?)<\/a.*?>/ можно найти, то, что находится внутри <a>? а тут задача обратная. что тут может быть не понятно?

invoice:
if (preg_match("/<\/a>.*?".$template.".*?/",$string)) {
....
}

Тоже не до конца понял условия :)
Может так?

нужно наоборот, чтобы текст не был внутри <a>

J
На сайте с 02.02.2009
Offline
53
#8

Perl:

$content =~ s/<a[^>]+>[^<]+<\/a>//g;

print $content;

Dweep
На сайте с 11.12.2006
Offline
207
#9
Shadow:
в обобщённом виде задача описана в первом посте: найти в строке текст, который не находится внутри тега <a>. дан пример строки.
ведь таким образом /<a.*?>(.*?)<\/a.*?>/ можно найти, то, что находится внутри <a>? а тут задача обратная. что тут может быть не понятно?


нужно наоборот, чтобы текст не был внутри <a>

Решение Вашей задачи в обобщенном виде:

echo preg_replace('#<a((?!</a>).)*</a>#is', '', $string);

читается как - удалить из текста все ссылки и их анкоры.

Если не то, то сформулируйте правильно постановку задачи.

Вот еще дополнение, которые описывает уточнения вашей задачи:

$text = preg_replace('#<a((?!</a>).)*</a>#is', '', $string);

if (preg_match('#'.$template.'#i', $text)) {

echo $template." есть ВНЕ ссылки";

} else {

echo $template." не встречается ВНЕ ссылки";

}

S
На сайте с 10.08.2006
Offline
115
#10
Dweep:
Решение Вашей задачи в обобщенном виде:

echo preg_replace('#<a((?!</a>).)*</a>#is', '', $string);

читается как - удалить из текста все ссылки и их анкоры.
Если не то, то сформулируйте правильно постановку задачи.

Вот еще дополнение, которые описывает уточнения вашей задачи:
$text = preg_replace('#<a((?!</a>).)*</a>#is', '', $string);
if (preg_match('#'.$template.'#i', $text)) {
echo $template." есть ВНЕ ссылки";
} else {
echo $template." не встречается ВНЕ ссылки";
}

удалять ссылки и анкоры не нужно, только поиск.

/<a.*?>(.*?)<\/a.*?>/ - это поиск ссылки, а тут задача обратная, поиск НЕссылки без модификации и удаления существующих ссылок.

т.е. в этой строке "<a href="http://site.ru">это ссылка</a> это не ссылка" ищется текст "это не ссылка" вне тега <a>. другие ссылки не должны быть модифицированы.

p.s.

если мы находим "это не ссылка" - мы делаем из него ссылку на другую страницу(preg_replace("reg_ex", "<a href=\"http://site.ru\">\\1</a>", $text)), но этот текст уже может быть внутри <a>, в этом случае мы его трогать не должны, иначе получится <a href="http://site.ru><a href="http://site.ru>это не ссылка</a></a>

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий