Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > нахождение ссылки


Автор: wwwdiz 10.7.2006, 10:34
есть ссылка:

<a href=сайт.ru>текст ссылки</a>

Вопрос:

каким образом  корректнее обеспечить её нахождение  в каком-либо текстовом блоке,
через регулярные или сравнение строк? smile  

Автор: Bikutoru 10.7.2006, 11:10
Через регулярные выражения, т.к. через простое сравнение получится намного более трудоемко (и скорее вего, менее понятно). Я бы сделал так:

Код

<?php

function getAttributesByRegexp($text, $regExp)
{
    $result = array ();
    if (preg_match_all($regExp, $text, $matches)) {
        foreach ($matches[0] as $k => $v) {
            $param = $matches[1][$k];
            $value = $matches[2][$k];
            $result[$param] = $value;
        }
    }                        
    
    return $result;    
}

function getAttributes($text) 
{
    $result = array ();
    $regArray = array (
        '/(\w+)=([^"\'\s]*)/is',
        '/(\w+)="([^"]*)"/is',
        '/(\w+)=\'([^\']*)\'/is',
    );
    
    foreach ($regArray as $curReg) {
        $result = array_merge($result, getAttributesByRegexp($text, $curReg));
    }
    
    return $result;
}
    
$text = '<a href="12" title=\'Test title\' alt=short-without-quotes>12</a><a href="1234" alt=\'Test\'>3412</a>';
if (preg_match_all('/<a([^>]+)>(.+?)<\/a>/is', $text, $matches)) {
    foreach ($matches[0] as $k => $v) {
        $linkData = getAttributes($matches[1][$k]);
        $linkData['text'] = $matches[2][$k];
        print_r($linkData);
    }
}

?>



И как результат:

Код

Array
(
    [href] => 12
    [title] => Test title
    [alt] => short-without-quotes
    [text] => 12
)
Array
(
    [href] => 1234
    [alt] => Test
    [text] => 3412
)


По-моему, так достаточно удобно.

 

Автор: wwwdiz 25.7.2006, 23:40
Bikutoru, а если .....

вот составил регулярное выражение, руководствуясь  http://vingrad.ru/PHP-ART-002378,
чувствую написал бред, но поясню что я этим хотел сказать.....

Код

^(<a\( )\s                #этим выражением хотел описать " <a " 
                               #правда запаметовал как в REGexp описывается пробел

(href=)+                  #хотел описать последавательность из "href="

\(\$ssil )\ws+      #м/ду "(" и "$" поставил "\" потому как хотел описать сам символ "$" (метод взял из "осей")

(title=)\(\$title )\ws+>)>)+\(\$text)\is+(<a>)+$     #ну а остальное состоит из подобного 

#$ssil, $title, $text - переменные содержащие текст 



Народ, в этом коде что-н правильное есть smile ?
 

Автор: SamDark 26.7.2006, 08:36
1. Нафига столько сохраняющих скобок(в твоём случае они вообще не нужны)? Если нужна группировка, используй (?:тут_регулярка)
2. Пробел описывается пробелом.
3. Переменные включать в регулярку лучше так $regexp = '~sdfsdfdsfd'.preg_quote($variable).'sdfsdfsfs~';
4. (href=)+ означает, что у тебя href= должно встретится один и более раз. Надо убрать скобки и +, т.е. просто href= 

Автор: smartov 26.7.2006, 11:23
wwwdiz, тебе же соучаснег Bikutoru пример предоставил.
Там же есть правильная регулярка. 
Код

... preg_match_all('/<a([^>]+)>(.+?)<\/a>/is', $text...

И функциями готовыми поделился чтобы получать значения href, alt и т.п - getAttributes. Что собственно вызывает вопросы?

SamDark, 
Цитата(SamDark @  26.7.2006,  07:36 Найти цитируемый пост)
4. (href=)+ означает, что у тебя href= должно встретится один и более раз.

Неа. 1 или более раз. 

Автор: SamDark 26.7.2006, 12:16
smartov
В данном конкретном случае и=или ;) 

Автор: wwwdiz 26.7.2006, 16:17
smartov, 

Код

preg_match_all('/<a([^>]+)>(.+?)<\/a>/is', $text...


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

если вот так вот???:
Код

^(<a\( )\s href=\'.preg_quote($ssil).'\ws title=\'.preg_quote($title).' \ws>)\'.$text.'\is+(<a>)$


И тут ещё один вопрос:
переменная $ssil содержит адрес ресурса, будет ли корректно вся эта тема работать?



 

Автор: SamDark 27.7.2006, 09:22
Что-то вроде:
Код

'~<a +(:?href=('.preg_quote($ssil).'))? +(:?title=('.preg_quote($title).'))? +>('.preg_quote($text).')</a>~is'


Так у тебя в $1 будет href, в $2 title, в $3 text. 

Автор: wwwdiz 27.7.2006, 14:56
SamDark, значение двоеточего какое?  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)