2012-07-29 1 views
0

저는 이미지가 매우 무거 우므로 WordPress 테마를 사용하고 있습니다. 이미지는 파일에 직접 링크해야하는 앵커 태그로 싸여 있습니다.PHP/wordpress에서 img src를 사용하여 앵커 href를 교환하십시오.

<a href="Direct_link_to_file" rel="shadowbox"><img src="Direct_link_to_file"></a> 

편집 :

<a href="Link_to_attachment_page" ><img src="Direct_link_to_file"></a> 

내가해야 할 것은 다음과 같이 포맷 할입니다 예를 들면 다음과 같습니다 이미지의 마크 업의 실수로이 글을 쓰는 마무리하지 않고 발표했다.

지금까지 페이지의 각 이미지에 대한 src를 가져 와서 배열에 저장하는 preg_match_all이 있습니다. 내가 배열에 해당 SRC 각 앵커 태그의 HREF를 변경하는 루프에서 사용 preg_replace이다 다음 한 무엇을했다

preg_match_all("/<img .*?(?=src)src=\"([^\"]+)\"/si", $content, $m); 

:이처럼 이제

for($k = 0; $k <$length; $k++){ 
    $pattern ="/<a(.*?)href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\")(.*?)>/i"; 
    $replacement = '<a$1 rel="shadowbox" href="'.$m[1][$k].'"$2$3.$4$5>'; 
    $content = preg_replace($pattern, $replacement, $content); 
    } 

, 그 성공적으로 HREF를 설정 배열에 저장된 값으로. 그러나 각 href는 동일한 이미지 (마지막 이미지)로 설정됩니다. 그것이 내가 갇혀있는 곳입니다. 지금 뭐야?

+0

['preg_replace_callback'] (http://php.net/preg_replace_callback)을 사용하고 루프를 사용하는 대신 함수에서 대체 논리를 처리해야합니다. 또는 더 비효율적이지만 더 단순한 DOM 메소드를 사용하십시오. 더 좋은데'qp ($ html) -> find ("img") 등으로'phpQuery' 또는'QueryPath'를 사용하십시오. – mario

+0

나는 이것에 대해 생각했지만 정말 생각하지 않습니다. 도움이 될거야. 배열 내에 저장된 src에 액세스 할 수 있도록 루프가 필요합니다. 나는 그것에 대해 잘못 될 수 있습니다. – user1560324

답변

0

내가 여기에 명백한 이유가 있는지 알 수는 없지만 배열의 마지막 부분으로 설정하는 이유는 무엇입니까?

$content = preg_replace($pattern, $replacement, $content); 

당신이 당신의 루프를 호출 할 때마다, 그것은 $ m의 현재 값 귀하의 모든 HREF 태그를 대체합니다 [1] [$ K] : 문제는이 라인입니다. 루프의 각 반복 끝에 href는 루프의 반복에 해당하는 이미지로 모두 설정됩니다. 따라서 최종 결과가 루프의 마지막 반복에 해당하는 이미지를 모두 포함하는 이유는 무엇입니까?

가능한 해결책 :

preg_replace이다는 확신 만 1 교체하려면 1로 설정 할 수있는 '제한'매개 변수는 각 시간 일어난다있다. $ 패턴이 이미 대체 된 href와 일치하지 않도록 할 수 있다면 문제가 해결 될 것입니다.

그렇지 않은 경우 mario의 'preg_replace_callback'솔루션이 작동해야합니다. preg_replace_callback에서 대체 할 인스턴스를 확인하는 방법은 다음 질문을 참조하십시오. Can I somehow know which replacement is taking place from within a callback of preg_replace_callback?

$ m 배열에서 적절한 요소에 액세스 할 수 있습니다.

+0

하하, 그래, 마지막 이미지가 왜 표시되는지 이해 했어. 거기서 어디로 가야할지 모르겠다. preg_replace 한도가 작동했습니다! 나는 맨 페이지에서 이전에 그것을 보았어 야했다. 그러나 나는 분명히 그것을 완전히 훑어 보았다. 내가 한 일은 모든 앵커에 일종의 "깃발 (flag)"로 속성을 설정 한 다음 플래그를 사용하여 앵커 만 검색하고 한 번만 바꾸기를 수행하는 것입니다. 도와 줘서 고마워. – user1560324

관련 문제