2017-02-23 50 views
1

Я пытаюсь захватить конкретные данные, где существует двоеточие. Я попытался это:Как исключить случаи в php regex

preg_match_all("/^(.+):(.+)/im", $input_lines, $output_array); 

на этом входные данные

last_name, first_name 
bjorge philip: hello world  
bjorge:world 
kardashian, kim 
some http://hi.com ok 
jim https://hey.com yes 
same http://www.vim.com:2018 why 
it's about 20/08/2018 1:23 pm 
time is 01:20:24 now 
capture my name : my name is micky mouse 
mercury, freddie 
I need to be: 
captured 
    capture me :  
if you can 
where is : freddie 
freddie is not: 
home 

мне нужно, чтобы захватить bjorge philip: hello world, bjorge:world, I need to be: captured, capture me : if you can, where is : freddie, freddie is not: home и capture my name : my name is micky mouse линии и исключить любую строку, которая содержит либо время или URL

+0

в вашем примере 'colon space' будет работать – nogad

+0

Сделайте вашу жизнь проще и повторите по каждой строке отдельно, а не пытайтесь написать многострочное регулярное выражение. – Sammitch

+0

@nogad, что пространство необязательно. извините, я отредактировал свой пример – Kal

ответ

1
<?php 
$input_lines="last_name, first_name 
bjorge philip: hello world  
bjorge:world 
kardashian, kim 
some http://hi.com ok 
jim https://hey.com yes 
same http://www.vim.com:2018 why 
it's about 20/08/2018 1:23 pm 
time is 01:20:24 now 
capture my name : my name is micky mouse 
mercury, freddie 
I need to be: 
captured 
    capture me :  
if you can 
where is : freddie 
freddie is not: 
home "; 

preg_match_all("/^|\n(?![^:]*$|.*?https?:|.*\d:\d+)(.*?:\s*\r?\n.*|.*?:\s?.+)/",$input_lines,$output_array); 
// \r? can be omitted from regex depending on system 

foreach($output_array[0] as $output){ 
    echo $output,"<br>"; 
} 

Regex pattern bre akdown:

^|\n      #start string from beginning of $input_lines or after any newline 
    (?!     #begin negative lookahead group 
     [^:]*$   #ignore lines with no colon 
     |    #OR 
     .*?https?:  #ignore lines with http: or https: 
     |    #OR 
     .*\d:\d   #ignore lines with digit colon digit 
    )     #end negative lookahead group 
    (     #begin capture group 
     .*?:\s*\r?\n.* #capture 2 lines if 1st line has a colon then 0 or more 
         # spaces with no non-white characters before the newline 
     |    #OR 
     .*?:\s?.+  #capture 1 line when it contains a colon followed by 
         # 0 or 1 space then 1 or more non-white characters 
    )     #end capture group 

Это возвращает:

bjorge philip: hello world 
bjorge:world 
capture my name : my name is micky mouse 
I need to be: captured 
capture me : if you can 
where is : freddie 
freddie is not: home 

я потратил значительное количество времени написания этого для вас решение. Если дальнейших расширений к набору проб нет, я надеюсь, что он получит ваш тиканье одобрения.

+0

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

+0

Я обновил свой ответ на ваш вопрос. – mickmackusa

+0

это потрясающе @mickmackusa. что бы вы добавили туда, если строка заканчивается двоеточием. т.е. 'hello world:'? – Kal