Вытащить текст

Статус
В этой теме нельзя размещать новые ответы.

Dador

Читатель
Заблокирован
Регистрация
14 Янв 2008
Сообщения
368
Реакции
99
  • Автор темы
  • Заблокирован
  • #1
Есть варианты name, id --- из вариантов тегов, которые тоже в массиве, также есть массив с возможными названиями

Нужно найти то что между <$tag $idname=$name ...> ... </$tag>
где ... любой текст
а:
$tag равен div или span
$idname равен id или name или class
$name равен массиву с именами к прмиеру $name=array('test-id-', 'post-id-');


Прошу помочь..., Заранее Спасибо!

p.s. с меня спасибки вам за помощь
 
Массив name большой? Между <$tag $idname=$name ...> ... </$tag> именно текст, или могут быть теги div/span? Если да то могут ли там быть сами искомые, вложенные <$tag $idname=$name ...> ... </$tag>? Ну, и язык какой?
Пока вот так:
Код:
{
<(div|span)\b
(?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'>"]+))?)*?
(?>\s*(?:id|name|class)\s*=\s*
   (?:(")|('))?+
       (?:n1|n2|n3|n4) #параметры
   (?(3)')(?(2)")
)
(?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'>"]+))?)*>
(.*?)
</\1\s*>
}xis
 
  • Автор темы
  • Заблокирован
  • #3
Массив name большой? Между <$tag $idname=$name ...> ... </$tag> именно текст, или могут быть теги div/span? Если да то могут ли там быть сами искомые, вложенные <$tag $idname=$name ...> ... </$tag>? Ну, и язык какой?
Пока вот так:
Код:
{
<(div|span)\b
(?>\s*\w+(?:\s*=\s*(?:"[^"]"|'[^']'|[^\s'>"]))?)*?
(?>\s*(?:id|name|class)\s*=\s*
   (?:(")|('))?+
       (?:n1|n2|n3|n4) #параметры
   (?(3)')(?(2)")
)
(?>\s*\w+(?:\s*=\s*(?:"[^"]"|'[^']'|[^\s'>"]))?)*>
(.*?)
</\1\s*>
}xis

теги могут быть, текст русский но возможны и англ. вставки ну названия к примеру)
а теги сами искомые не могут быть, т.к. это к примеру новосной сайт и у него такая арх.:
Код:
<div name=content>

<div name=news-id-1>

<div aglin=center><b>Привет!</b><br> Наш сайт открыт!</div><br>Мы очень хотим чтобы вы посещали его <img scr=/imgs/smile/d.gif alt=D>

</div>

<div name=news-id-2>...</div>

<div name=news-id-3>...</div>

<div name=news-id-4>...</div>

<div name=news-id-5>...</div>

</div>
 
Вообще-то имелся ввиду язык программированния:)
Вот, будет работать в Perl 5.10 и PHP большинства версий.
Код:
{
<(div|span)\b
(?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*?
(?>\s*(?:id|name|class)\s*=\s*
   (?>(?:(")|('))?+
       (?>a1|a2|a3)
   (?(2)"|(?(3)'|(?=[>\s]))) )
)
(?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*+>
 (  #содержание- 4-ые скобки
    (?:
        [^<]++|
        <(div|span)\b
            (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*+>
        (?4)</\5\s*>|
        .
    )*?
 )
</\1\s*>
 }xis;
 
  • Автор темы
  • Заблокирован
  • #5
Вообще-то имелся ввиду язык программированния:)
Вот, будет работать в Perl 5.10 и PHP большинства версий.
Код:
{
<(div|span)\b
(?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*?
(?>\s*(?:id|name|class)\s*=\s*
   (?>(?:(")|('))?+
       (?>a1|a2|a3)
   (?(2)"|(?(3)'|(?=[>\s]))) )
)
(?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*+>
 (  #содержание- 4-ые скобки
    (?:
        [^<]++|
        <(div|span)\b
            (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*+>
        (?4)</\5\s*>|
        .
    )*?
 )
</\1\s*>
 }xis;

php, спасибо, пробую

и теперь такой вопрос, как же его впихнуть в preg_match_all или хотябы в preg_match, когда пробую без кавычек - синтасическая ошибка, с ними (любыми) = тоже
как его вставить?
 
Потому что внутри есть кавычки обоих видов. Следовательно, кавчки того вида, в которые заключена регулярка, надо экранировать, либо использовать синтаксис heredoc (если PHP 5.3 то можно nowdoc).
В случае двойных кавычек или heredoc здесь надо также экранировать слеши в обратных ссылках.
Пример с heredoc:
PHP:
$names=join('|', $names);
$re=<<<EOF
{
<(div|span)\b
(?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*?
(?>\s*(?:id|name|class)\s*=\s*
   (?>(?:(")|('))?+
       (?>$names)
   (?(2)"|(?(3)'|(?=[>\s]))) )
)
(?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*+>
 (  #содержание- 4-ые скобки
    (?:
        [^<]++|
        <(div|span)\b
            (?>\s*\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>'"]+))?)*+>
        (?4)</\\5\s*>|
        .
    )*?
 )
</\\1\s*>
}xis
EOF;
preg_match_all($re, $text, $m);
 
можно ли модифицировать это выражение, чтобы оно не обрывалось на первом найденом </div|span|и т.д.>, а сколько открыто - столько и закрыто.

Регэскп ооч хороший, но ооч сложный =(
 
  • Автор темы
  • Заблокирован
  • #8
можно ли модифицировать это выражение, чтобы оно не обрывалось на первом найденом </div|span|и т.д.>, а сколько открыто - столько и закрыто.

Регэскп ооч хороший, но ооч сложный =(

да хотелось бы, только я его не знаю (RegExp)... Вытаскивать текст можно тогда будет автоматически, т.е. спарсил гуглю, взял текст, уникальным сделал, и делай что хочешь
 
можно ли модифицировать это выражение, чтобы оно не обрывалось на первом найденом </div|span|и т.д.>, а сколько открыто - столько и закрыто.

Регэскп ооч хороший, но ооч сложный =(
Всмысле? Если речь о вложенности div/span тегов внутри искомого div/span, то оно и так их учитыват.
Приведи пример текста, где регулярка не работает, как хотелось бы.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху