Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB58.7570
BTC/USD0.0000
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 16.11.2011, 00:00   #1
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,382
Бабло: $470735
По умолчанию А помогите мне с регекспом тоже?

задача: в коде html/xml странички нужно отметить начало и конец заданных тегов, но именно самый верхний уровень этих тегов, дочерние узлы не трогать.

Например, есть код:
Код:
<span href=1111>4532</span>ttt
<a href=143>452</a>ttt
<ul>
    <li>a</li>
    <li><ul><li>1</li><li>2</li></ul></li>
</ul>ttt
<br/>ttt
<div>ttt
    <ul>
        <li>a3432 <a href=143>452</a>ttt</li>
        <li>444444</li>
    </ul>ttt
</div>
<br/>
<br/>
и, к примеру, даны теги ul и a, и надо отметить их начало словом OPEN и конец словом CLOSE, чтобы получилось такое:

Код:
<span href=1111>4532</span>ttt
OPEN<a href=143>452</a>CLOSEttt
OPEN<ul>
    <li>a</li>
    <li><ul><li>1</li><li>2</li></ul></li>
</ul>CLOSEttt
<br/>ttt
<div>ttt
    OPEN<ul>
        <li>a3432 <a href=143>452</a>ttt</li>
        <li>444444</li>
    </ul>CLOSEttt
</div>
<br/>
<br/>
смысл в том, чтобы не было вложенных OPEN/CLOSE
надо на пхп, но это не суть, главное без всяких dom/xpath, а только на регекспах и стандартных языковых конструкциях

я делаю так:
к начальному тексту прибавляю с двух сторон теги CLOSE и OPEN, потом в цикле ищу нужный тег между CLOSE и OPEN, и что-то не могу регексп составить:
$text = "CLOSE $text OPEN";

$text = preg_replace('/((?<=CLOSE)(?<!OPEN))(<ul.*>.*<\/ul>)((?=OPEN)(?!CLOSE))/Usi', '${1}OPEN${2}CLOSE${3}', $text); - тут включена жадность по умолчанию

для тех, кому привычнее ленивые регекспы:
$text = preg_replace('/((?<=CLOSE)(?<!OPEN))(<ul.*?>.*?<\/ul>)((?=OPEN)(?!CLOSE))/si', '${1}OPEN${2}CLOSE${3}', $text);

для тега а еще один такой же регексп, только по центру будет а вместо ul
и не работает сучка
я примерно понимаю почему не работает, но у меня уже

кто решит, тот будет носить звание главного РЕГЕКСПиста на гоуфаке
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 16.11.2011, 00:07   #2
sergeospb
коплю на феррари
 
Регистрация: 03.07.2008
Сообщений: 1,260
Бабло: $148195
По умолчанию

блин, а чем dom то не угодил? как раз задача для него.
sergeospb вне форума  
Старый 16.11.2011, 00:10   #3
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,382
Бабло: $470735
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от sergeospb Посмотреть сообщение
блин, а чем dom то не угодил? как раз задача для него.
дом долгий, жрет много проца и памяти, а в среде запуска скрипта эти вещи на вес золота. Да и тупо ДОМа может не быть
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 16.11.2011, 00:40   #4
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,382
Бабло: $470735
ТС -->
автор темы ТС По умолчанию

возможно этот тот случай, про который говорят: "html не является регулярным языком" и его нельзя "свернуть/развернуть" регуляркой."
но можно regexp-рекурсией, или регексп колбеками в несколько заходов (но тогда не будет звания главного регексписта, только кандидат)

только не на строковых функциях и не домом
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 16.11.2011, 01:04   #5
majordon
Senior Member
 
Аватар для majordon
 
Регистрация: 11.10.2008
Сообщений: 5,909
Бабло: $829038
По умолчанию

Ну если ты не можешь на этом форуме решить такую задачу, то не знаю кто сможет
majordon вне форума  
Старый 16.11.2011, 01:55   #6
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,382
Бабло: $470735
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от majordon Посмотреть сообщение
Ну если ты не можешь на этом форуме решить такую задачу, то не знаю кто сможет
тут народу полно кто парсеры пишут, поэтому наверняка есть кто в теме
у меня мало практики с lookbehind и lookahead проверками и другими сложными регекспами. И я там хуйню написал в первом посте, надо примерно так:

preg_replace('/(CLOSE.*?)(?<!OPEN)(<ul.*?>.*<\/ul>)(?!CLOSE)(.*?OPEN)/si', '${1}OPEN${2}CLOSE${3}', $text);

тут позиционирование искомой группы работает правильно, а вот вложенными тегами беда - сжираются, и наверно одного позиционирования тут маловато, надо восходящие замены чайлдов делать

More

(и с жадностью мой комментарий надо читать наоборот: модификатор U=Ungreedy=НЕ_жадный, пример выше - жадный)

задача то - найти участки ВНЕ указанных тегов, не такая уж и редкая задачка
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 16.11.2011, 01:58   #7
sspy
главный злодей гофака
 
Аватар для sspy
 
Регистрация: 18.06.2007
Сообщений: 5,305
Бабло: $879203
По умолчанию

В зависимости от наличия многострочных тегов и \r\n задача решаема/нерешаема чистым регекспом.

Судя по примеру чистый тег должен начнатся с новой строки(для простых случаев), тогда такой регесп покатит ^[^<]*<ul> и ^[^<]*<\/ul>[^<]*$

Последний раз редактировалось sspy; 16.11.2011 в 02:08.
sspy на форуме  
Старый 16.11.2011, 02:12   #8
oso
кодер
 
Аватар для oso
 
Регистрация: 21.01.2008
Сообщений: 316
Бабло: $69585
По умолчанию

я на strpos написал))
__________________
php скрипты от $25 Отзывы: 2013-2011, 2010, 2009. acя: 384 846 ноль два шесть
oso вне форума  
Старый 16.11.2011, 02:14   #9
Drunk Monk
Je suis moine ivre
 
Аватар для Drunk Monk
 
Регистрация: 03.03.2009
Сообщений: 15,217
Бабло: $797160072
По умолчанию

Регулярки - ересь, ТОЛЬКО СТРОКОВЫЕ ФУНКЦИИ ТОЛЬКО ХАРДКОР!
__________________
EssayPartner.com. Партнерка по эссе трафу.
Drunk Monk на форуме  
Старый 16.11.2011, 02:17   #10
sspy
главный злодей гофака
 
Аватар для sspy
 
Регистрация: 18.06.2007
Сообщений: 5,305
Бабло: $879203
По умолчанию

Цитата:
Сообщение от Drunk Monk Посмотреть сообщение
Регулярки - ересь, ТОЛЬКО СТРОКОВЫЕ ФУНКЦИИ ТОЛЬКО ХАРДКОР!
сроковые зачастую быстрее и удобней в подобных ситуациях, хотя и выглядит похуже
sspy на форуме  
Закрытая тема



Опции темы
Опции просмотра