2013-07-07 2 views
2

브라우저에 렌더링되는 모든 HTML 페이지를 보유하고 있지만 모든 이미지 src를 데이터로 바꿔야하는 변수 ($ output)가 PHP에서 있습니다. lazyload js를 얻으려면 image 일하다.body 태그 사이의 모든 이미지 src 바꾸기

요구 사항은 다음과 같습니다

  • IMG SRC는 동일한 구조를 가지고 있지 않습니다, 우리는이 :

    <의 img SRC = "img.jpg"고도 = ''/ >

    <의 img 고도 = "텍스트"SRC = 'img.gif'= "MyClass에"SRC = "img.png"고도 >

    < IMG 클래스 = ' '/ >

    ... 등

  • 난 단지 > 및 <을 {옵션 텍스트를 가질 수} < 몸 사이에 이미지를 대체 할

    /몸 >

  • 교체하지 마십시오 IMG 태그 < 스크립트 {옵션 여기에 텍스트} > 및 </스크립트 사이 >

감사합니다.

+1

지금까지 시도한 것을 보여줄 수 있습니까? – Jerry

+1

** 정규 표현식을 사용하여 HTML을 구문 분석하지 마십시오 **. 정규식으로 HTML을 안정적으로 구문 분석 할 수는 없으며 슬픔과 좌절을 당할 것입니다. HTML이 예상과 다르게 변경되면 코드가 손상됩니다. 이미 작성, 테스트 및 디버깅 된 모듈로 HTML을 올바르게 구문 분석하는 방법의 예는 http://htmlparsing.com/을 참조하십시오. –

답변

0

많은 사람들이 정규 표현식으로하는 실수는 모든 것을 수행하는 거대한 정규 표현식을 작성하려고 시도하는 것입니다. 이 방법은 광기를 속인다. 불가능할뿐만 아니라 (문제에 따라) 복잡하고 추하며 깨지기 쉽습니다. 관리 가능한 단계로 문제를 해결하는 것이 좋습니다.

당신은 당신이 단지 <body><img> 태그를 교체하고 싶은 말은, 그러나 유일한 장소 <img> 태그 유효<body> 내에, 그래서 나는 이것을 무시하는거야. <body> 외부의 <img> 태그를 무시해야하는 경우 preg_replace_callback에 전체를 포장하여 <body>을 입력에서 뺄 수 있습니다.

그래서 제가 취한 접근법은 입력에서 <img> 태그의 모든 인스턴스와 일치시키는 두 개의 정규 표현식과 alt 속성을 대체하는 정규 표현식을 사용하는 것입니다.

$output = preg_replace_callback('/<img .*?>/', function($matches) { 
     return preg_replace('/\bsrc\s*=\s*[\'"](.*?)[\'"]/', 
      'data-image="$1"', $matches[0]); 
}, $input); 

주 반복 메타 문자 *에 게으른 정량 ?의 사용 :이없이, 두 개의 연속 <img> 태그 우리가 원하지 않을 것입니다 하나의 큰 한으로 처리됩니다이를 위해, 나는 preg_replace_callback 사용 . 바꾸기 기능에서 나는 src 속성을 찾아 data-image 속성으로 바꿉니다.

  • 당신이 따옴표로 구분 src 특성 (<img src="what's_up_doc.jpg">) 또는 그 반대에 아포스트로피가있는 경우 :이 솔루션이 실패 곳

    는 여기에 있습니다.이 문제를 해결할 필요가 있다면, 큰 따옴표로 묶인 속성을 처리하기위한 것이고 작은 따옴표로 묶인 속성을 처리하는 두 가지 다른 대체 정규 표현식을 가져야합니다.

  • <img> 태그가 여러 줄에 걸쳐있는 경우 외부 정규 표현식에서이 문제가 발생하면 . 대신 [^]을 사용하여 개행을 포함하여 모든 것을 일치시킬 수 있습니다.
관련 문제