2017-01-24 10 views
1

하나의 사례와 관련하여 질문이 있습니다.하나의 주제 PHP에서 동일한 항목을 preg_replace하는 방법?

나는이 문자열 형식으로 데이터를 PHP는 preg_replace이다() 함수를 사용하고 있습니다 :

12:05 Place1 12:40 14:00 16:30 Place2 "Test" 29 Janury 

나는이 같은 아웃풋이 될 필요가 :

<li>29 January - Place1 - 12:05</li> 
<li>29 January - Place2 "Test" - 12:40 14:00 16:30</li> 

내 정규 표현식 :

/(\d[0-9]:\d[0-9]).+?(\D+).+?(\d[0-9]\s(January|February|March))/ 

저는 현재 다음과 같은 것을 사용하고 있습니다 :

,

단지 첫 경기를 보여 문제

$text = "12:05 Place1 12:40 14:00 16:30 Place2 "Test" 29 Janury"; 
$data = preg_replace("/(\d[0-9]:\d[0-9]).+?(\D+).+?(\d[0-9]\s(January|February|March))/", "<li>$3 - $2 - $1</li>", $text); 
echo $data; 
,
  • 1월 29일 - Place1 - 12시 5분
  • 어쩌면 누군가가이 사건을 해결하는 방법을 알아?
    고마워요 :)

    +1

    코드에 구문 오류가있어서'$'내부에서'''를 이스케이프 처리해야합니다. 또한'Janury'로'January '의 철자가 잘못되었습니다. 그 코드의 결과를 어떻게 알 수 없습니다. – Barmar

    +0

    그 문제를 해결 한 후에도 문자열에 일치하는 항목이 하나만 있습니다. 왜 첫 번째 일치 항목보다 더 많이 찾을 것으로 기대합니까? – Barmar

    +0

    안녕하세요, 유감스럽게도, 페이로드 텍스트에 충분한주의를 기울이지 않았습니다. 실수 : ( 수정 한 후에도 여전히 한 줄의 데이터 만 반환 할 수 있습니다. 모든 데이터를 가져올 수 있다면 관심이 있습니다. 응답 해 주셔서 감사합니다! –

    답변

    0

    PCRE 엔진이 도달하기 전에 문자열의 끝에서 일치 항목을 사용하기 때문에 하나의 정규식으로는 수행 할 수 없습니다. 당신은 두 단계로이 작업을 수행 할 필요가 : PREG_OFFSET_CAPTURE

    1. preg_match()가 다른 변수에 문자열의 끝에서 날짜를 캡처 할 수 있습니다. 원본 문자열을 자르려면 제공된 오프셋을 사용하십시오.
    2. preg_match_all() & 시간을 배열로 절단 한 다음, 배열을 반복하여 각 일치 문자열 &을 사용하여 목록을 만듭니다. '/((?:\s*+\d\d:\d\d)++)\s++((?:.(?!\d\d:\d\d\s))++)\s*+/'이 적합한 패턴입니다.
    +0

    조언을 주셔서 감사합니다, 그것은 또한 작동합니다 :) 내 문제가 해결 된 것 같아요) –