Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Помогите составить регулярное выражение (https://javascript.ru/forum/server/65660-pomogite-sostavit-regulyarnoe-vyrazhenie.html)

snovapavel 01.11.2016 11:31

Помогите составить регулярное выражение
 
Добрый день!

Подскажите, пожалуйста, как с помощью регулярных выражений PHP получить строку, у которой в начале и в конце (ВАЖНО!) строки НЕ стоит тег div (не обрамляет её (строку))?

Пример:

// эту строку не надо
<div>Lorem ipsum.</div>

// эту строку надо
<div>Lorem</div> ipsum.

// эту строку надо
Lorem ipsum.

// и эту строку надо
<li>Lorem ipsum.</li>

// эту не надо
<div><span>Lorem ipsum.</span></div>

ksa 01.11.2016 13:40

Цитата:

Сообщение от snovapavel
получить строку, у которой в начале и в конце (ВАЖНО!) строки НЕ стоит тег div

Начать можно с этого...

var arr=[
	'<div>Lorem ipsum.</div>',
	'<div>Lorem</div> ipsum.',
	'Lorem ipsum.',
	'<li>Lorem ipsum.</li>',
	'<div><span>Lorem ipsum.</span></div>'
];
var reg=/^<div>.*(?=<\/div>$)/i;
for (var i=0; i<arr.length; i++) {
	alert(arr[i]+' - '+((reg.test(arr[i]))? 'не брать': 'брать'));
};

laimas 01.11.2016 14:11

ksa,
это не РНР. :)

ksa 01.11.2016 14:15

Цитата:

Сообщение от laimas
это не РНР

Там разный подход к регулярным выражениям? Или синтаксис другой?

ksa 01.11.2016 14:22

Цитата:

Сообщение от laimas
это не РНР

Если верить этому
http://www.skillz.ru/dev/php/article...chaynikov.html
Различий не так уж и много... :D

laimas 01.11.2016 14:27

Цитата:

Сообщение от ksa
Там разный подход к регулярным выражениям? Или синтаксис другой?

В РНР рег. выражения Perl совместимые и конечно богаче, чем в JS. И задается строка, а не массив. Чего нет точно в РНР, так это for (var i=0; i<arr.length; i++) :)

Да и не нужно этого, проще удалить непотребное, оставив нужное, и если каждая строка не имеет переносов, то просто:

$s = '<div>Lorem ipsum.</div>
 
<div>Lorem</div> ipsum.
 
Lorem ipsum.
 
<li>Lorem ipsum.</li>
 
<div><span>Lorem ipsum.</span></div>';

$s = preg_replace('/<div>.+<\/div>/', '', $s);

echo $s;

laimas 01.11.2016 14:28

Цитата:

Сообщение от ksa
Если верить этому .... Различий не так уж и много...

Не верьте, рег. выражениям JS до рег. выражений Perl как пехом до Берлина. :)

ksa 01.11.2016 14:48

Цитата:

Сообщение от laimas
Да и не нужно этого, проще удалить непотребное, оставив нужное

Ты спец - тебе видней...

snovapavel 01.11.2016 16:30

laimas,

Здравствуйте, мне не надо удалить, мне нужно, если это не блок див, то обернуть параграф тегом p, чтобы вышло так:

Было:

<div>Lorem ipsum.</div>

<div>Lorem</div> ipsum.

Lorem ipsum.

<li>Lorem ipsum.</li>

<div><span>Lorem ipsum.</span></div>


Стало:

<div>Lorem ipsum.</div>

<p><div>Lorem</div> ipsum.</p>

<p>Lorem ipsum.</p>

<p><li>Lorem ipsum.</li></p>

<div><span>Lorem ipsum.</span></div>

laimas 01.11.2016 18:24

Цитата:

Сообщение от snovapavel
обернуть параграф тегом p

Нужно просто возвратиться к предыдущей теме.

Aetae 01.11.2016 18:50

$subject = "<div>Lorem ipsum.</div>
<div>Lorem</div> ipsum.
Lorem ipsum.
<li>Lorem ipsum.</li>
<div><span>Lorem ipsum.</span></div>";
$pattern = "/(*ANYCRLF)^<div>.*(?<!<\/div>)$|^(?!<div>).+$/imu";
$replacement = "<p>$0</p>";
echo preg_replace( $pattern , $replacement , $subject );

Но вообще регулярками с html работать - моветон.

laimas 01.11.2016 19:01

Aetae,

это не соответствует требуемому, а если строки будут иметь переносы (что неизвестно из условия), тем более не будет работать.

Aetae 01.11.2016 19:07

laimas, соответствует последнему комменту. Впрочем если строки должны содержать переносы - модификация минимальна:
в $subject подаётся массив нужных строк и в регулярке меняется модификатор m на s.

laimas 01.11.2016 19:23

Цитата:

Сообщение от Aetae
соответствует последнему комменту

Виноват, я сам запутался уже. :)

Цитата:

Сообщение от Aetae
в $subject подаётся массив нужных строк и в регулярке меняется модификатор m на s

Вопрос в том строк чего, как понять что есть законченная строка? Если по переносу, то зачем модификатор s? И к тому же открывающий тег может быть в строке N, а закрывающий в Nk. Простая замена модификатора не поможет. :)

Учитывая, что латиница en в utf также представлена одним байтом, а ищем именно латиницу (любой символ вне тега не важен), модификатора u не требуется, замена "Lorem ipsum" на "Русский текст" без этого модификатора никак не скажется на результате.


Часовой пояс GMT +3, время: 01:05.