2013-06-07 1 views
4

이전 버전의 WYSIWYG 편집기를 최신 버전으로 업그레이드했습니다. 이미지 크기가 저장되는 방법에는 차이가 있습니다. 이전 버전의 편집기는 이미지 태그에 너비 및 높이 매개 변수를 추가하는 데 사용되었습니다. 새 편집기는 스타일 매개 변수를 만들고 폭 및 높이를 스타일로 추가합니다.preg_replace all <img> 매개 변수

주위에 <a> 태그를 래핑 할 수 있도록 사용하는 preg_replace 함수가 있습니다.

새 preg_replace가 스타일 매개 변수의 너비와 높이를 저장하므로 더 이상 작동하지 않습니다.

레그로 대체 :

$Content = preg_replace('#<img(.*?)src="([^"]*/)?(([^"/]*)\.[^"]*)"([^>]*?)>((?!</a>))#', '<a rel="group" class="fancybox fancy" title="" href="$2$3"><img$1src="$2$3"></a>', $Content); 

잘 알고,이 같은 새로운 에디터를 저장 이미지 :

<img alt="" src="" style="" /> 

반면이 같은 이전 편집기 저장된 이미지 :

<img src="" width="404" height="228" alt="" /> 

어떻게하면 전체 스타일 요소도 복사하도록 내 preg_replace를 리팩터링 할 수 있습니까? 이전 버전과의 호환성도 좋을 것입니다. 시간에 대한

감사합니다 :)

+0

당신은 할 모든 요소와 일치 할 수 있습니다 파싱 ​​한 다음 원본 일치 배열을 사용하여 이전 구문을 바꿉니다. 필요한 것은 preg_match를 정규식으로 몇 줄의 코드로 확장하는 것입니다. – baldrs

+0

이런 종류의 일을하기 위해 정규 표현식 대신 DOM 파서를 사용하는 것이 좋습니다. – Spudley

+1

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

답변

5

이 시도 :

그래서 (나는이 expresion을 테스트하지만, YMMV 그래서 파이썬,하지 PHP에서) 이런 식으로 뭔가를 시도

$regex = '#<img([^>]*) src="([^"/]*/?[^".]*\.[^"]*)"([^>]*)>((?!</a>))#'; 
$replace = '<a rel="group" class="fancybox fancy" title="" href="$2"><img$1 src="$2"$3></a>'; 
$Content = preg_replace($regex, $replace, $Content); 
6

당신은 입력이 올바른 것으로 예상 경우, 그렇지 않으면 그냥 HTML 파서 사용이 솔루션을 사용할 수 있습니다, 더 많은 정규식을 단순화 수 :

$string = 'Some text <img alt="bar" title="foo" src="http://example.com/example.jpg" style="width:200px;height:400px;" /> Some text'; 

$new_string = preg_replace('#<img.+?src="([^"]*)".*?/?>#i', '<a href="$1">$0</a>', $string); 
var_dump($new_string); 

설명 :

  • <img : 일치 <img
  • .+? : 어떤 하나 또는 그 이상의 시간 (ungreedy)
  • src=" 일치 : src="
  • ([^"]*) 일치 : /> 또는 > 때까지 " 아무것도 일치 : 그것은
  • ".*?/?>" 0 번 이상 및 그룹을 제외하고 아무것도 일치
  • i 수정 자 : 대소 문자를 구분하지 않음

<img.+?src\s*=\s*"([^"]*)".*?/?>을 사용하고 싶을 수도 있습니다. = 전후에 공백이있을 수도 있습니다. 편집기를 수정하지만 Spudley 그의 주석에서 언급 한 바와 같이

Online demo

2

, 당신은 수도 seriously consider a DOM parser (에디터가 이미지를 추가하는 방법을 제어 할 수 없습니다 특히, (빠른 구글은 몇 가지 옵션이 변합니다) 어느 쪽인지에 따라 링크를 추가하는 것이 더 쉽습니다. 개인적으로는 TinyMCE을 해킹하려고 시도하지 않을 수도 있지만 wysihtml5에 대해 고려할 수 있습니다.)

어쨌든 나는 빗 나간다.이 방법을 사용하면 가능한 한 정규 표현식을 단순화하십시오. <a> 태그로 감싸기 만하면됩니다 (속성을 보존하는 한 속성 자체가 무엇인지 걱정하지 않아도됩니다).

preg_replace('<img(.*)src="([^ "]*)"([^>]*)>', '<a href="$2"><img$1src="$2"$3></a>', $whatever_your_string_is); 
+1

답변 해 주셔서 감사합니다. 대신 DOM 파서를 사용해야하며 앞으로는 그렇게 할 것이라고 생각합니다. 그러나 당분간 Prothid의 대답은 나에게 맞는 것입니다. 나는 당신의 제안을 언급했습니다 :) –

관련 문제