2016-10-06 4 views
0

Я делаю что-то с регулярным выражением, но код ниже не работает на моем компьютере. Я использую пакет XAMPP. Однако, когда я проверил свой PHP-код на этом сайте https://ideone.com/nFkBnC, он работал. Почему это происходит?PHP-код не работает xampp

<?php 
$single="<div id='quote'> 

</br><input onclick='this.select();' id='selectable' value='User 
'></br><div class='content'> 
^^^^^ MILAN TODAY ^^^^^ 



4 
-4- 
4444 
44444 
444444 
4444444 
44444444 
444444444 
*3333333333* 
444444444 
44444444 
4444444 
444444 
44444 
4444 
444 
44 
4 
* 
# 670 # (((30))) # 370 # 

# 789 # (((40))) # 370 # 

***gl*** 
</br></div></div>"; 

if (preg_match('/(\R4{3,4}\D44\D)/', $single, $double)) { 
     echo "working"; 
} 

?> 

Тот же код echo «работает» на этом сайте, но его ложь на моем компьютере.

+1

Что вы имеете в виду под "не работает"? –

+2

Я предполагаю, что код берет слишком длинные перерывы на кофе, просто опираясь на его лопату, беседуя с граблями и т. Д. Звучит как плохой сотрудник, его следует уволить. –

+0

Должен работать эхо, если он работает, но он этого не делает. – Hutarsh

ответ

1

В Windows символом новой строки обозначены два символа: возврат каретки после строки: CR + LF. При работе с основанной на шаблоне утилитой эти два символа имеют почти один способ представления \r\n. Но Unix-подобные системы представляют собой строку с одним символом: LF

Во время работы вашего скрипта на хост поверх Linux, ваш RegEx \R4{3,4}\D44\D работает, потому что \D может соответствовать линии кормить \n (\x0A) и немедленно 44 Матчи.

           Here 
              _________ 
              |   | 
    4 4 4 4 . 4 4 4 . 4 4 
^^^^^^^^^^^
\x04 \x04 \x04 \x04 \x0A \x04 \x04 \x04 \x0A \x04 \x04 

Но в Windows вещи немного отличаются. \D соответствует CR (\x0D), но после LF (\x0A) никогда не соответствует, потому что ваш двигатель сразу ищет 44. Таким образом, весь шаблон не удается.

             Here 
               ______________ 
               |    | 
    4 4 4 4 . . 4 4 4 . . 4 4 
^^^^^^^^^^^^^
\x04 \x04 \x04 \x04 \x0D \x0A \x04 \x04 \x04 \x0D \x0A \x04 \x04 

Сказать, что я считаю, является выход strlen() на Linux хост и пришел с хоста Windows. Базовая математика приводит число, которое такое же количество новых строк в вашей входной строке:

379 - 347 = 32 // CR characters in Windows OS 

Но если вы измените свой RegEx на \R4{3,4}\D{1,2}44\D вы увидите, что он работает, или если вы только значите, новые строки, вы должны действительно изменить чтобы:

\R4{3,4}\R44\R 

\R соответствует какой-либо новой строкой (т.е. CR + LF, LF, CR, ...)

+1

Большое спасибо.Это сработало для меня, и я больше понял о регулярном выражении. :) – Hutarsh