$| = 1;
$src = '<a title=wow href="www.codenet.ru">
ahaha<tagg>grr</tagg>
</a>';
$start = '<';
$end = '>';
$rval = qq/'[^']*?'|"[^"]*?"|[^ ]+/;
$href_tkn = '[hH][rR][eE][fF]';
$title_tkn = '[tT][iI][tT][lL][eE]';
$nest = 0; $chunk = '';
while ($src =~ s/^(.*?)(?:$start(.*?)$end)//sx) {
$tchunk = $1; $tcon = $2;
if ($nest == 1) {
$chunk .= $&;
if ($tcon =~ m,^/[aA]\s*$,s) {
$chunk =~ s,\n,
,g;
print "Chunk: " . $chunk . ";\t";
$nest = 0; next;
}
}
if ($nest == 0 and $tcon =~ m,^[aA],s) {
if ($tcon =~ m,$href_tkn=($rval),s) {
print "Href: " . $1 . ";\t";
}
if ($tcon =~ m,$title_tkn=($rval),s) {
print "Title: " . $1 . ";\t";
}
$nest = 1;
}
next;
}
Снова Regex
Подскажите пожалуйста как мне в regex обозначить следующее условие: любое количество любых символов, среди которых не встречается такая последовательность: abc
[^abc]*
так прокатывает:
[^>]*
[^(abc)]*
в общем мне нужно вот что:
из тега <a> выбрать href="xxx" причем чтобы первые скобки вернули все что в <a... .../a>, вторые саму ссылку, третьи текст ссылки. Причем так нужно учесть что кавыечк после = может и не быть. В любом месте тэг может прерваться переводом строки. В теле самого <a> может встречаться 0 до n количество левых пробелов и сам href может чередоваться в любой последовательности с другими параметрами.
Вот что у меня пока есть, но я не могу определить сам текст ссылки:
/(<a +?[^>]*href=\"?([^>\"]*)\"?[^>]*>(здесь идет текст ссылки)<\/a>)/
что то типа этого:
<script>
function runit(str)
{
var str="<a href=http://www.ya.ru>kuku</a>"
output1=str.match(/<a([^>]+>[^<]+<)\/a>/i)[1];
output2=str.match(/<a href=['|"]?([^ >"']+)/i)[1];
output3=str.match(/<a[^>]+>([^<]+)<\/a>/i)[1];
alert
(
output1+"\n"+
output2+"\n"+
output3
)
}
</script>
<button onclick=runit()>runit</button>
$comment=eregi_replace("<a target=\"_blank\" href=\"([^\"]*)\">([^<]*)</a>","\\2",$comment);
Цитата:
Originally posted by mike
$comment=eregi_replace("<a target=\"_blank\" href=\"([^\"]*)\">([^<]*)</a>","\\2",$comment);
$comment=eregi_replace("<a target=\"_blank\" href=\"([^\"]*)\">([^<]*)</a>","\\2",$comment);
Майк, тут получается, что внутри <a> не может быть других тэгов.
Сори, я в перле не очень шарю, но есть вопрос такой: как тут отлавливается сам текст ссылки, т.е. ее подпись?
А самое главное - обработка самой ссылки у меня идет через callback функцию, так что сама ссылка должна получаться одной строкой regexp
Решение: /(<a +?[^>]*href=\"?([^>\"]*)\"?[^>]*>(.*?)<\/a>)/si
не забудь про такую ссылку:
Нет, ну как я понял ему нужно отловить тэг <a> с любыми аттрибутами, причем независимо порядка их расположения. Точнее отловить целевой url и содержимое <a>(ето)</a>. Если найду у себя php щас то перверстаю мой пример на php.
$p1="\"[^\"]*\"";
$p2="\'[^\']*\'";
$p3="[^ >]*";
$p_par=" +($p1|$p2|$p3) *";
$p_href=" +href=($p1|$p2|$p3) *";
/<a($p_par)*($p_href)+($p_par)*>(.*?)<\/a>/si
Может быть есть косяки? кто просечет?
Цель - да. Отловить только сам URL и текст ссылки
$p_attr = '(?:\s+[a-zA-Z0-9_-]+(?:=(?:\\'.*?\\'|".*?"|[^ ]*))?)*';
$p = '#(.*?)#s';
/** И проверка **/
if (preg_match($p,$str,$matches)) {
for ($i = 0; $i < count($matches); $i++) {
$matches[$i] = str_replace('<','<',$matches[$i]);
$matches[$i] = str_replace('>','>',$matches[$i]);
}
echo "Link: $matches[1]
\n";
echo "Text: $matches[2]
\n";
foreach ($matches as $key=>$value) {
echo $key . ' ## ' . $value . "
\n";
}
}
=) запоздало, ну да неважно. авось еще кому пригодится.