vamtam-import-search-replace.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. /**
  3. * Modified version of https://github.com/interconnectit/Search-Replace-DB/blob/master/srdb.class.php (v3.1.0)
  4. */
  5. class Vamtam_Import_Search_Replace {
  6. /**
  7. * Replace all occurrences of the search string with the replacement string.
  8. *
  9. * @author Sean Murphy <sean@iamseanmurphy.com>
  10. * @copyright Copyright 2012 Sean Murphy. All rights reserved.
  11. * @license http://creativecommons.org/publicdomain/zero/1.0/
  12. * @link http://php.net/manual/function.str-replace.php
  13. *
  14. * @param mixed $search
  15. * @param mixed $replace
  16. * @param mixed $subject
  17. * @param int $count
  18. * @return mixed
  19. */
  20. public static function mb_str_replace( $search, $replace, $subject, &$count = 0 ) {
  21. if ( ! is_array( $subject ) ) {
  22. // Normalize $search and $replace so they are both arrays of the same length
  23. $searches = is_array( $search ) ? array_values( $search ) : array( $search );
  24. $replacements = is_array( $replace ) ? array_values( $replace ) : array( $replace );
  25. $replacements = array_pad( $replacements, count( $searches ), '' );
  26. foreach ( $searches as $key => $search ) {
  27. $parts = mb_split( preg_quote( $search ), $subject );
  28. $count += count( $parts ) - 1;
  29. $subject = implode( $replacements[ $key ], $parts );
  30. }
  31. } else {
  32. // Call mb_str_replace for each subject in array, recursively
  33. foreach ( $subject as $key => $value ) {
  34. $subject[ $key ] = self::mb_str_replace( $search, $replace, $value, $count );
  35. }
  36. }
  37. return $subject;
  38. }
  39. /**
  40. * Wrapper for regex/non regex search & replace
  41. *
  42. * @param string $search
  43. * @param string $replace
  44. * @param string $string
  45. * @param int $count
  46. *
  47. * @return string
  48. */
  49. public static function str_replace( $search, $replace, $string, &$count = 0 ) {
  50. if( function_exists( 'mb_split' ) ) {
  51. return self::mb_str_replace( $search, $replace, $string, $count );
  52. } else {
  53. return str_replace( $search, $replace, $string, $count );
  54. }
  55. }
  56. /**
  57. * Take a serialised array and unserialise it replacing elements as needed and
  58. * unserialising any subordinate arrays and performing the replace on those too.
  59. *
  60. * @param string $from String we're looking to replace.
  61. * @param string $to What we want it to be replaced with
  62. * @param array $data Used to pass any subordinate arrays back to in.
  63. * @param bool $serialised Does the array passed via $data need serialising.
  64. *
  65. * @return array The original array with all elements replaced as needed.
  66. */
  67. public static function recursive_unserialize_replace( $from = '', $to = '', $data = '', $serialised = false ) {
  68. // some unserialised data cannot be re-serialised eg. SimpleXMLElements
  69. try {
  70. if ( is_string( $data ) && ( $unserialized = @unserialize( $data ) ) !== false ) {
  71. $data = self::recursive_unserialize_replace( $from, $to, $unserialized, true );
  72. }
  73. elseif ( is_array( $data ) ) {
  74. $_tmp = array( );
  75. foreach ( $data as $key => $value ) {
  76. $_tmp[ $key ] = self::recursive_unserialize_replace( $from, $to, $value, false );
  77. }
  78. $data = $_tmp;
  79. unset( $_tmp );
  80. }
  81. // Submitted by Tina Matter
  82. elseif ( is_object( $data ) ) {
  83. // $data_class = get_class( $data );
  84. $_tmp = $data; // new $data_class( );
  85. $props = get_object_vars( $data );
  86. foreach ( $props as $key => $value ) {
  87. $_tmp->$key = self::recursive_unserialize_replace( $from, $to, $value, false );
  88. }
  89. $data = $_tmp;
  90. unset( $_tmp );
  91. }
  92. else {
  93. if ( is_string( $data ) ) {
  94. $data = self::str_replace( $from, $to, $data );
  95. }
  96. }
  97. if ( $serialised )
  98. return serialize( $data );
  99. } catch( Exception $error ) {
  100. error_log( $error->getMessage() );
  101. }
  102. return $data;
  103. }
  104. }