2011-03-01 2 views
1

Я новичок, пытающийся найти текстовый файл для некоторых серийных номеров. Я использую PHP 5, и я читаю файл CSV. Я создал следующее регулярное выражение:Регулярное выражение help, не найти то, что мне нужно

/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/ 

Я смотрю через довольно большой текстовый файл для серийных номеров, напоминающих один, перечисленных ниже:

37DB4B71-DAFA-4311-9AC6-0005646CB9BC 

Он всегда находит первый серийный номер, но он не находит никого из других. Есть, по крайней мере, 15 человек, какие-либо предложения о том, что я делаю неправильно? У меня сложилось впечатление, что \ w найдет либо цифру, либо цифру в случае чувствительности. Я решил, что это сработало, когда он нашел первый экземпляр.

Вот код, который я использую для разбора CSV-файла, я просто ввожу весь файл и пытаюсь разбить его на массив по серийному номеру. Ниже приведен код, который я использую, чтобы узнать, могу ли я, по крайней мере, разделить серийные номера, прежде чем делать что-либо еще. Сейчас он показывает мне массив с 1 элементом внутри. Этот элемент - это серийный номер, за которым следует куча текста и серийные номера, которые мне нужны.

Еще одна причина, по которой я использую preg_split, заключается в том, что за серийным номером следует запятая, а затем некоторые сведения о серийном номере. Я пытался использовать Preg_split для разрыва файла, чтобы текст соответствовал порядковому номеру.

$searchPattern = '/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/'; 
//Get the contents of the File 
$contents = file_get_contents('C:/files/andrew1.csv'); 
if ($contents === false){ 
    echo 'Sorry, there was a problem reading the file.'; 
} else{ 
    $NoHTMLContents = strip_tags($contents); 
    $splitContents = preg_split($searchPattern, $NoHTMLContents); 
    echo '<pre>'; 
    print_r($splitContents); 
    echo '</pre>'; 
} 
+0

Просто сделал, я получил 45 мин езды домой, так что я буду отвечать на любые вопросы, один раз Я уже там. Спасибо за помощь – Drewdin

+0

Если за серийным номером стоит запятая, почему в вашем регулярном выражении требуется, чтобы он * не *, а запятая? –

+0

@Mark Спасибо за предложение, если я удалю $, это изменит регулярное выражение соответствующим образом? Спасибо – Drewdin

ответ

4

Это поможет, если вы вывесили свой код, но я предполагаю, что вы должны использовать preg_match_all вместо preg_match как последний возвращает только первый матч.

Вы также должны помнить, чтобы использовать PCRE_MULTILINE pattern modifier (м):

preg_match_all('/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/m', $s, $matches); 

Смотреть это работает онлайн: ideone


Для подхода preg_split основе, попробуйте использовать предпросмотр:

$matches = preg_split("/\n(?=\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/m", $s); 

Посмотрите на него онлайн: ideone

+0

Я использую preg_split, поскольку я пытаюсь разделить текст по его серийному номеру. Я отправлю код – Drewdin

+0

Это было очень полезно, спасибо Mark! – Drewdin

0

Я только что проверил ваше регулярное выражение и совпадения с серийным номером. Вы можете использовать this online tester PHP preg_match. Было бы хорошо, если вы разместите другие серийные номера и если вы делаете что-то вроде i в конце, чтобы указать, игнорируя случай,

$regex = "/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/i"; 
Смежные вопросы