PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

ereg> <POSIX 正規表現関数
Last updated: Fri, 05 Sep 2008

view this page in

ereg_replace

(PHP 4, PHP 5)

ereg_replace正規表現による置換を行う

説明

string ereg_replace ( string $pattern , string $replacement , string $string )

この関数は、string をスキャンして pattern にマッチするものを探し、 マッチしたテキストを replacement で置換します。

パラメータ

pattern

POSIX 拡張正規表現。

replacement

pattern の中に括弧でくくられた部分 文字列が含まれている場合、replacement の中に \\数字 のような部分文字列を埋め込むこともできます。この部分は、 「数字」番目の括弧でくくられた部分文字列にマッチする文字列に 置き換えられます。また、\\0 は文字列全体を 指します。9 個までの部分文字列を使うことができます。括弧は 入れ子になっていても構いません。この場合は開き括弧 '(' が 最大 9 個まで使用可能です。

string

入力文字列。

返り値

置換後の文字列を返します。 マッチしなかった場合は、元の文字列をそのまま返します。

たとえば、以下のサンプルコードは "This was a test" と 3 回表示します。

例1 ereg_replace() の例

<?php

$string 
"This is a test";
echo 
str_replace(" is"" was"$string);
echo 
ereg_replace("( )is""\\1was"$string);
echo 
ereg_replace("(( )is)""\\2was"$string);

?>

注意しなければならないのは、パラメータ replacement として整数値を使用する場合、 期待する結果が得られない可能性があるということです。これは、 ereg_replace() がその数値を文字コードとして 解釈し使用するためです。例えば、次のようになります。

例2 ereg_replace() の例

<?php
/* これは期待した通りに動作しません。 */
$num 4;
$string "This string has four words.";
$string ereg_replace('four'$num$string);
echo 
$string;   /* 出力: 'This string has   words.' */

/* これは動作します。 */
$num '4';
$string "This string has four words.";
$string ereg_replace('four'$num$string);
echo 
$string;   /* 出力: 'This string has 4 words.' */
?>

例3 URL をリンクで置換する

<?php
$text 
ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
                     
"<a href=\"\\0\">\\0</a>"$text);
?>

注意

ヒント

Perl 互換の正規表現構文を使用する preg_replace() のほうが、 ereg_replace() より高速に動作することがよくあります。



ereg> <POSIX 正規表現関数
Last updated: Fri, 05 Sep 2008
 
add a note add a note User Contributed Notes
ereg_replace
computer_guru
07-Aug-2008 08:39
Here is the code I use to make links clickable. The code only works on xxxx:// (i.e. ftp://, http://, etc...). It does not work on www. because that is how I want it. The reason my code has an if condition is that it ignores html links and only modifies non-html urls. (see below)

<?php
function make_clickable($text)
{
   
    if (
ereg("[\"|'][[:alpha:]]+://",$text) == false)
    {
       
$text = ereg_replace('([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])', '<a target=\"_new\" href="\\1">\\1</a>', $text);
    }
    return(
$text);
}
?>

My function ignores code like this:

<a href="http://php.net"> php.net </a>

But it would make this one click able:

http://php.net
jammin320
03-Jul-2008 04:52
Just a quick addition to the last post -

modifying the regular expression for the www clause to include a newline at the begining will allow it to catch URLs that are the first in a line but not the first in a string. The previous version would only catch them if a space preceded the value...

    // match www.something
    $text = ereg_replace("(^| |\n)(www([.]?[a-zA-Z0-9_/-])*)", "\\1<a href=\"http://\\2\">\\2</a>", $text);
http://www.bbgames.co.nr
04-May-2008 11:57
In response to a post above, his coding was a bit wrong.  The correct coding should be :

<?php
function hyperlink($text)
{
   
// match protocol://address/path/
   
$text = ereg_replace("[a-zA-Z]+://([.]?[a-zA-Z0-9_/-])*", "<a href=\"\\0\">\\0</a>", $text);

   
// match www.something
   
$text = ereg_replace("(^| )(www([.]?[a-zA-Z0-9_/-])*)", "\\1<a href=\"http://\\2\">\\2</a>", $text);

   
// return $text
   
return $text;
}
?>

You can use this function like this:
<?php
$line
= "Check the links: www.yahoo.com http://www.php.net";
hyperlink($line);
// Now, all text that looks like a link becomes a link
?>
tugla
01-Mar-2008 02:29
If you're not relying on regular expressions, str_replace() can be far faster.
Renjith
21-Jan-2008 03:02
Code:

<?php

$s
= "Coding PHP is fun.";

$pattern = "(.*)PHP(.*)";
$replacement = " They say \\1other languages\\2";

print
ereg_replace($pattern, $replacement, $s);

?>

Output:
They say Coding other languages is fun.
Explanation:

"PHP" is replaced with "other languages", and the sentence is changed a little, using \1 and \2 to access the parts within parentheses.
http://php-regex.blogspot.com/
bjwarshaw2 at yahoo dot com
30-Sep-2007 10:27
It's worth mentioning for ultimate clarity that you're safest using double quotes when matching a pattern, since without them, metacharacters will be interpreted as a backslash plus another character.

Granted, this is part of the language syntax for the string type, but it might not be quite so obvious when dealing with patterns in this function, which is taking the pattern as a parameter.

So if you find that '[\n]' is taking the 'n' out of your string and leaving the new lines alone, switch to doubles before changing anything else.
jarfil at jarfil dot net
26-Aug-2007 06:42
For simple patterns like "[a-z]", preg_replace is up to 6 times faster than ereg_replace.
mephissto at gmail dot com
30-May-2007 10:40
Your right but you just need to replace by :

<?php
function hyperlink(&$text)
{
   
// match protocol://address/path/
   
$text = ereg_replace("[a-zA-Z]+://([.]?[a-zA-Z0-9_/-])*", "<a href=\"\\0\">\\0</a>", $text);

   
// match www.something
   
$text = ereg_replace("(^| |.)(www([.]?[a-zA-Z0-9_/-])*)", "\\1<a href=\"http://\\2\">\\2</a>", $text);
}
?>
hoffaboffa (at) hotmail dott com
16-May-2007 10:03
cristiklein's hyperlink function is nice but works incorrect with a www-string like this

\r\nwww.google.se

then it does not become a hyperlink
bmcswee at gmail dot com dot invalid
07-Apr-2007 01:33
Function to strip an HTML tag out of a string. I use this in part for parsing XML documents.

<?php

function stripTags($tag, $string) {
       
// Regular expressions only work with strings if the regexp has been pre-concocted
   
$regExp = "<" . "$tag" . "[^>]*>";

   
$string = str_replace("</$tag>", "", $string);
   
$string = ereg_replace($regExp, "", $string);
   
    return
$string;   
}

?>
Joachim Kruyswijk
25-May-2006 04:59
Use mb_ereg_replace() instead of ereg_replace() when working with multi-byte strings!
chrish at shield dot on dot ca
13-Feb-2006 10:43
I was having problems with Microsoft Outlook viewing forms within email.  I was only able to see the first word of the text box after I used the following code.

If I entered words into the text box and used the enter key to give me a CRLF I could see in the returned data the %0D%0A string, so I assumed if I just used the ereg-replace as below it would just replace the %0D%0A with a single space...

function remove_extra_linebreaks($string) {
   $new_string=ereg_replace("%0D%0A", " ", $string);
  return $new_string;
}

But the form as displayed by Outlook only showed the text upto the first replaced string, then it was blank!
I could view the source of the email and it would show all of the text I expected.

The following will show the correct data in the form

function remove_extra_linebreaks($string) {
   $new_string=ereg_replace("%0D%0A", '+', $string);
  return $new_string;
}
Chris
21-Jan-2006 04:43
I've updated the function a little that was posted below.  I use it to make database field names readable when making a header row.  I needed it to quit putting a space in "GPA" and to put a space in between numbers and letters.

<?php
/**
*  Converts "fieldcontainingGPAInMyDatabaseFrom2005"
*  To       "Field Containing GPA In My Database From 2005"
*/
function innerCapsToReadableText($text) {
   
$text = ereg_replace("([A-Z]) ", "\\1",ucwords(strtolower(ereg_replace("[A-Z]"," \\0",$text))));
    return
ereg_replace("([A-Za-z])([0-9])", "\\1 \\2", $text);
}
?>
codergeek42 at users dot sourceforge.net
22-Dec-2005 02:15
In response to "php dot net at lenix dot de," a cleaner (easier to read) method would be to type-cast the integer as a string by quoting it. For example:

<?php
$foo
= 42;
echo
ereg_replace ( "bar", "$foo" , "foobar" ); /* Would output "foo42". */
?>
benlanc at ster dot me dot uk
23-Aug-2005 07:49
Quite how I managed to get my previous post so wrong, I don't know. Correction follows:
<?php
/* function to turn InterCaps style strings (i.e. CSS Properties in Javascript) to human readable ones */
function deInterCaps($var){
   return
ucfirst(strtolower(ereg_replace("[A-Z]"," \\0",$var)));
}

$interCapsString = "aLoadOfNonsenseToDemonstrateTheFunction";

echo
deInterCaps($interCapsString);

// output: A load of nonsense to demonstrate the function
?>
php dot net at lenix dot de
07-Jul-2005 07:26
One thing to take note of is that if you use an integer value as the replacement parameter, you may not get the results you expect. This is because ereg_replace() will interpret the number as the ordinal value of a character, and apply that.

If you're ever having trouble with this one there's an easy workarround:

instead of
<?php
$foo
= 23;
echo
ereg_replace ( "bar", $foo , "foobar" );
?>

just do

<?php
$foo
= 23;
echo
ereg_replace ( "bar", "" . $foo , "foobar" );
?>

to replace "bar" inside "foobar" with the string "23".
zaczek at gmail dot com
05-Jul-2005 08:09
If you want the function to process query strings, such as:

http://www.php.net/index.php?id=10%32&wp=test

modify the function as follows:

function hyperlink(&$text)
{
   // match protocol://address/path/
   $text = ereg_replace("[a-zA-Z]+://([-]*[.]?[a-zA-Z0-9_/-?&%])*", "<a href=\"\\0\">\\0</a>", $text);

   // match www.something
   $text = ereg_replace("(^| )(www([-]*[.]?[a-zA-Z0-9_/-?&%])*)", "\\1<a href=\"http://\\2\">\\2</a>", $text);
}
cristiklein at yahoo dot com
10-Apr-2005 06:50
Sometimes, you would like to match both styles of URL links that are common in chat windows:

http://www.yahoo.com
www.yahoo.com

You can do this by using the following code:

<?php
function hyperlink(&$text)
{
   
// match protocol://address/path/
   
$text = ereg_replace("[a-zA-Z]+://([.]?[a-zA-Z0-9_/-])*", "<a href=\"\\0\">\\0</a>", $text);

   
// match www.something
   
$text = ereg_replace("(^| )(www([.]?[a-zA-Z0-9_/-])*)", "\\1<a href=\"http://\\2\">\\2</a>", $text);
}
?>

You can use this function like this:
<?php
$line
= "Check the links: www.yahoo.com http://www.php.net";
hyperlink($line);
// Now, all text that looks like a link becomes a link
?>
bgoodman at osogrande dot com
03-Mar-2005 07:25
When you are dealing with databases you can end up with quite a few \" to deal with.  To ereg_replace all these with something else it requires you to \ the \ and \ the " so you end up with:

$var1 = '\"';
$var2 = ereg_replace('\\\"','1234',$var1);

print $var2;  //this should print 1234
eerie at gmx dot net
28-Feb-2005 04:44
<?php $path = ereg_replace("\\", "/", $path); ?>
as posted from mmtach at yahoo dot com causes an error because you have to escape the backslash twice, once for the quotation marks and a second time due the posix syntax.
<?php $path = ereg_replace("\\\\", "/", $path); ?>
or
<?php $path = ereg_replace('\\', "/", $path); ?>
should both work as expected. since you don't have to escape the backslash in brackets (posix syntax) his alternative works also.

ereg> <POSIX 正規表現関数
Last updated: Fri, 05 Sep 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites