- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
есть строка: <a href="http://site.ru">это ссылка</a> это не ссылка
каким выражением можно найти текст, что НЕ является ссылкой (не находится в тегах <a bla-bla> </a>)?
то, что является ссылкой ищется отлично, а вот наоборот не получается
Постановка задачи некорректна, т.к. вы не пишете чем блок текста ограничен у вас справа. Если у вас там конец строки, например, то:
$str =~ /<A [^>]+>(.*?)$/si;
поместит все что после вашей ссылки в $1 (Perl, но в ПХП все примерно то же самое). Если у вас справа не конец строки а что-то другое, то вместо доллара вы рисуете регекс на правую часть, а все что между левой и правой известными частями - будет ваш искомый блок.
Постановка задачи некорректна, т.к. вы не пишете чем блок текста ограничен у вас справа. Если у вас там конец строки, например, то:
$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);
может быть и конец строки и не конец
перед тем как что-то делать нужно четко сформулировать алгоритм. это - не алгоритм. нужно четко понять что и по каким правилам будет искаться. и потом уже решать - либо искать "что-то", либо "все кроме чего-то". либо искать "нечто" и потом вторым (третьим и т.д.) проходом чистить до состояния "что-то".
искаться будет не весь текст, что не является ссылкой (анкором ссылки), а лишь некоторое совпадение с искомым значением (например $template = "search name")
тут совсем ничего не понял.
если касательно конкретной строки где пробелы в конце могут быть, а могут и не быть - перед $ ставится \s*
но по переводу человеческих регекспов на php функции - это, к сожалению, не ко мне.
есть искомое значение ($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> бла-бла';
текст "это не ссылка" должен быть найден в первой строке, но никак не во второй (т.к. во второй он является анкором ссылки)
if (preg_match("/<\/a>.*?".$template.".*?/",$string)) {
....
}
Тоже не до конца понял условия :)
Может так?
Короче чем дальше в лес тем толще партизаны. Каждое последующее уточнение только хуже делает. Если вам нужно найти заранее известную подстроку при условии что она не находится внутри анкора (тэга А), то вам нужно первым проходом почистить текст от тэгов, а вторым искать текст. Но что вы этим получите - непонятно, разве что можно посчитать количество вхождений (плотность что-ли считаете?). Если вы хотите найти позиции в тексте, для дальнейшей обработки то можно не чистить текст первым проходом, а заменить ссылки на аналогичное число символов. И так далее.
Для каждой задачи есть решение и не одно. Но задачу нужно уметь корректно поставить. Иначе вы и сами её решить не сможете.
в обобщённом виде задача описана в первом посте: найти в строке текст, который не находится внутри тега <a>. дан пример строки.
ведь таким образом /<a.*?>(.*?)<\/a.*?>/ можно найти, то, что находится внутри <a>? а тут задача обратная. что тут может быть не понятно?
if (preg_match("/<\/a>.*?".$template.".*?/",$string)) {
....
}
Тоже не до конца понял условия :)
Может так?
нужно наоборот, чтобы текст не был внутри <a>
Perl:
$content =~ s/<a[^>]+>[^<]+<\/a>//g;
print $content;
в обобщённом виде задача описана в первом посте: найти в строке текст, который не находится внутри тега <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." не встречается ВНЕ ссылки";
}
Решение Вашей задачи в обобщенном виде:
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>