php에서 문자 치환을 할 때 특정 문자 사이의 내용은 그대로 두고 특정 문자만을 수정하고 싶습니다.

hyeonsoft의 이미지

php의 str_replace();를 사용해보려고 생각 중입니다.
예를들어 $data에 자료를 넣고 그 문자 자료에서 =aaa=가 있으면 =aaa=를 (aaa)와 같이 a만 그대로 두고 나머지들을 바꾸는 방법이 알고 싶습니다.

김정균의 이미지

질문이

=aaa= => aaa
=aaaaa= => aaaa
=b= => b
=abc= => abc

이렇게 되는 것을 원하는 건가요? 그렇다면 str_replace로는 힘들고 정규식을 이용해야 합니다.

$data = preg_replace ('/=([^=]+)=/', '\\1', $data);

와 같이 하시면 됩니다.

hyeonsoft의 이미지

$data='abcdaa=aaa=asdfvb=bac=as';
일 때 어떤 결과를 거치면

echo $data;
//abcdaa(aaa)asdfvb(bac)as

와 같이 나타나는 걸 물어보려 한 건데,,
적어주신 정규식을 응용하면 가능할 것 같네요.
hyeonsoft의 이미지

//문법 작성
//html 문법수정
$grammar[0] = '/\r\n/';
$htmlcode[0] = '<br/>';
$grammar[5] = '/\r/';
$grammar[4] = '/\n/';
$htmlcode[4] = '<br/>';
$htmlcode[5] = '<br/>';
$grammar[1] = '/\u0020/';
$htmlcode[1] = '&nbsp;';
//제목
$grammar[20] = '/=([^=]+)=/';
$htmlcode[20] = '<h2>\\1</h2>';
$grammar[21] = '/==([^=]+)=/';
$htmlcode[21] = '<h3>\\1</h3>';
//링크
$grammar[108] = '/[[/';
$htmlcode[108] = '<a(kldp.org 하이퍼링크 금지) href="./index.php?w=';
$grammar[109] = '/|/';
$htmlcode[109] = '">';
$grammar[110] = '/]]/';
$htmlcode[110] = '</a>';
//치환
$temp=preg_replace($grammar, $htmlcode, $data['db']);
$wikiview=$temp;
//문법 작성 끝
echo $wikiview;

흰화면만 뜨네요.. 어디서부터 잘못되었는지 모르겠습니다.
김정균의 이미지

일단 php 에서 escape character 들은 single quoting 할 경우 즉 '\r' 로 하면 \ + r 로 인식이 됩니다. 그러므로 "\r"과 같이 double quoting 해 주셔야 원하는 대로 치환이 될 겁니다.

그리고, preg_replace에서 배열로 처리할 경우, 배열 순서대로 실행이 되는데, 위와 같이 배열 번호를 순서대로 하지 않았을 경우 어떻게 동작할지 모르겠네요. 저렇게 코드를 짜 본적이 없어서 ^^;

그리고, 원하시는 바를 정확히 모르겠어서 코드를 수정해 드리기는 힘드네요 :-) 원본과 결과물을 정확하게 표시해 주시면 코드 수정이 쉽게 가능할지도..

hyeonsoft의 이미지

현재 제가 하고 있는 건 간략한 위키 엔진을 짜 보는게 목적입니다. 위에서는 생략되었으나 위에 $data['db']로 위키 내용을 담아오는 쿼리가 있습니다.
그래서 내용 중의 제목을 위키 내에서
=제목1=
로 표시하고, html 코드로 php가 치환해 주어
<h2>제목</h2>
가 되도록 만드는 게 하고 싶습니다.
위키 자체가 만들면 워낙 문법이 많고 우선 순위가 있는 지라 배열로 저렇게 썼습니다.
나머지는 preg_replace로 처리하면 속도만 느려질 것 같으니 다시 str_replace로 되돌릴 생각입니다.
배열은 str_replace에서 사용시 순서대로 처리되고, 건너뛰어도 문제 없는 걸 보아 상관 없을 것 같습니다.

<요약> =제목1= → <h2>제목</h2>

김정균의 이미지

흰 화면만 나온다면 E_ERROR가 발생했을 수도 있겠네요. 예를 들어

$grammar[108] = '/[[/';

의 경우, pcre compile error가 발생할 겁니다.

$grammar[108] = '/\[\[/';

이렇게 해 주셔야 합니다. 정규식에서 [] 문자는 pattern을 만드는데 사용하는 예약어이기 때문에 escape을 해 주셔야 합니다. 일단 아무것도 안나온다고 하니, 이 문제가 아닐까 싶네요.

hyeonsoft의 이미지

제 php 엔진이 문제인지는 모르겠지만 preg_replace를 스킵하는 것 같네요.
$data['db'] echo 하니 제대로 뜨는데 $temp echo 하니 나머지는 다 되는데 $temp가 텅 비었어요.
아니면 preg_replace에서의 배열이 문제일까요

shint의 이미지

<?php
   preg_match("/(?P<foo>April)(.*)(?P<bar>2003)/",
                       'April aaa, 2003',
                       $matches);
   print_r($matches);
 
echo "<BR>";
echo $matches[0]. "<BR>";
echo $matches[foo]. "<BR>";
echo $matches[1]. "<BR>";
echo $matches[2]. "<BR>";
echo $matches[3]. "<BR>";
echo $matches[bar]. "<BR>";
echo "<BR>";
 
 
$string = $matches[foo].$matches[bar];
$pattern = '/(?P<foo>April)/';
$replacement = 'bbbb';
$val = preg_replace($pattern, $replacement, $string);
echo $val."<BR>";
 
 
$string = 'April aaa, 2003';
$pattern = '/b\baaa\b/i';
$replacement = '${1}1,$3';
$val = preg_replace($pattern, $replacement, $string);
echo $val
 
/*
Array ( [0] => April aaa, 2003 [foo] => April [1] => April [2] => aaa, [bar] => 2003 [3] => 2003 ) 
April aaa, 2003
April
April
aaa, 
2003
2003
 
bbbb2003
April aaa, 2003
*/
 
?>

http://search.naver.com/search.naver?ie=utf8&sm=stp_hty&where=se&query=php+replace
http://php.net/manual/kr/function.preg-replace.php
http://php.net/manual/kr/function.preg-match.php
http://php.net/manual/kr/function.preg-replace-callback.php
http://php.net/manual/kr/function.preg-split.php
http://php.net/manual/kr/function.str-replace.php

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.